为什么 connection.timezone 是 None 对于 django 中的 postgres 数据库连接?

why connection.timezone is None for postgres db connection in django?

我正在使用 postgres 探索 django。我遇到了一件奇怪的事情。我的 postgres 连接的 TIMEZONE 设置(我不是在谈论 settings.py 中的 TIME_ZONE)令人惊讶地设置为 None。我已将时区设置为 'Asia/Kolkata' 并且 USE_TZ 也是 True。根据 django 文档,当 USE_TZ 为 True 时,连接时区默认为 'UTC',而当 settings.py 时它将等于 TIME_ZONE 的值,当 USE_TZ 为假。但是,对于我来说,在这两种情况下,connection.timezone 的值都是空的。

我已经尝试使用 sqlite3 后端,我得到了预期的结果。我不知道,为什么我没有得到预期的 postgres 行为。

我正在使用 django==1.10.5 并且 postgres 在 64 位机器上是 9.5。我正在使用以下命令获取连接的时区。

from django.db import connection
print (connection.timezone)

提前致谢。

django.db.connection 是包装 database-specific 连接的通用抽象。

您可以使用 connection.connection 访问 the underlying database connection

对于 PostgreSQL,这将是一个 psycopg2 连接。使用 psycopg2 获取连接时区的 documented 方法是 get_parameter_status("TimeZone").

将所有内容放在一起,这应该可行:

connection.connection.get_parameter_status("TimeZone")

但是等等!数据库连接是延迟创建的,所以只有当你已经执行了某种数据库操作时它才会起作用。为确保您有连接,您可以调用 connection.ensure_connection(),或者,如果您想要一个表达式:

>>> from django.db import connection
>>> connection.cursor().connection.get_parameter_status("TimeZone")
'UTC'

有关参考,请参阅 PostgreSQL 数据库包装器的 ensure_timezone() 方法。