2017-09-05 4 views
0

Ich benutze Postgres für mein Django-Projekt, und für komplizierte Abfragen zu db verwende ich connection.cursor(). Heute habe ich ein Problem mit rohen SQL-Abfrage mit Datetime im Filter:Django rohe SQL mit datetime

Als Ergebnis haben wir leere Liste. Aber wenn ich den von psql Konsole abfragen, sehe ich, dass Ergebnis nicht leer ist:

SELECT * FROM orders_orderstatus WHERE datetime > '2017-09-05 16:07:16'; 

id |  status  |   datetime    
----+--------------------+-------------------------------+ 
256 | created | 2017-09-05 16:10:59.602091+07 
257 | delivered | 2017-09-05 16:11:00.834547+07 
258 | created | 2017-09-05 16:11:03.499364+07 

Warum django nicht diese Ergebnisse nicht erhalten?

+0

Django ORM Umgehen kann tückisch sein. In vielen Fällen ist es besser, beim Erstellen von QuerySets zu bleiben. Die oben gezeigte Abfrage kann auf diese Weise einfach ausgeführt werden. – Chris

+0

In jedem Fall [zwei Verbindungen zu PostgreSQL können andere Daten sehen] (https://www.postgresql.org/docs/current/static/mvcc-intro.html). Dies ist [ein Feature] (https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Verwenden Sie Transaktionen mit Ihren manuellen Abfragen? Ohne weitere Informationen ist es schwer zu wissen, ob das hier passiert. – Chris

Antwort

1

Dies ist zeigen, wie python und psql datetime Strings tzinfo interpretieren.

psql mit Ihrer Zeichenfolge Zeit als UTC. Python senden Sie es mit + hours_of_your_time_zone

Wenn Ihre tz +07 so versuchen, in Python db:

with connection.cursor() as cursor: 

    cursor.execute(
     "SELECT * from orders_orderstatus WHERE datetime > '2017-09-05 09:07:16'" 
    ) 
    row = [item[0] for item in cursor.fetchall()] 
return row 

in Zukunft versuchen, Datetime-Objekte mit tz zu verwenden.

Sieht aus wie Sie Einstellung haben:

USE_TZ=True