Django使用datetime的原始SQL查询

3

我在我的Django项目中使用PostgreSQL,对于复杂的数据库查询,我使用connection.cursor()。今天,我在使用带有datetime筛选条件的原生SQL查询时遇到了问题:

    with connection.cursor() as cursor:

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

结果是空列表。但如果我从psql控制台查询,我会看到结果不为空:

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 

为什么 Django 没有收到这些结果?

绕过Django的ORM可能会很棘手。在许多情况下,最好坚持构建QuerySet;上面显示的查询可以轻松地使用这种方式执行。 - Chris
无论如何,两个连接到PostgreSQL可能会看到不同的数据。这是多版本并发控制的一个特性。您是否在手动查询中使用事务?没有更多信息,很难知道这是否是发生在这里的情况。 - Chris
1个回答

5

这篇文章将向您展示Python和psql如何解释datetime字符串的tzinfo。

psql将使用您的字符串时间作为UTC时间。 Python会将其发送到数据库并添加您所在时区的小时数。

如果您的时区是+07,请尝试以下操作:

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

未来,请尝试使用带有时区的datetime对象。

看起来您有以下设置:

USE_TZ=True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接