使用PostgreSQL进行Django / Python和Raw SQL查询

时间:2017-11-29 00:16:10

标签: python django postgresql datetime

我正在使用cursor.execute在Django项目中练习我的原始SQL查询。

这是我的Django models.py数据库架构:

class Client(models.Model):
    date_incorporated = models.DateTimeField(default=timezone.now)

这里是psql表格的描述:

# \d+ client

      Column       |           Type           |      Modifiers     | Storage  |
-------------------+--------------------------+--------------------+----------+
 date_incorporated | timestamp with time zone | not null           | plain    |

在这里我感到困惑:

如果我使用psql查询表格中的数据,我会得到:

# SELECT date_incorporated FROM client;

   date_incorporated    
------------------------
 2017-06-14 19:42:15-04
 2017-11-02 19:42:33-04
(2 rows)

这对我有意义。在PostgreSQL docs中,它表明这是(我相信)只是一个格式正确并存储为UTC时间戳的字符串。

当我使用此查询浏览Django时:

cursor.execute('SELECT date_incorporated FROM client;')
data = [dict(zip(columns,row)) for row in cursor.fetchall()]

using the dictfetchall method from the Django docs

...我的date_incorporated字段变成了一个python datetime对象。

{'date_incorporated': datetime.datetime(2017, 11, 2, 23, 42, 33, tzinfo=<UTC>)}

在这个应用程序构建中,我希望用户能够输入原始SQL,并将输入的字符串放入要执行的cursor.execute(rawSQL)函数中。我希望输出与psql版本相同。

如果我使用的是Django ORM,我可能希望将timestamp with time zone转换为时区感知datetime对象,但因为我正在做原始SQL调用,我希望得到2017-06-14 19:42:15-04,而不是python datetime对象。

fetchall方法是否仍然充当Django ORM并转换某些字段?

1 个答案:

答案 0 :(得分:1)

我相信这是使用任何界面驱动程序的标准转换。 即使使用py-postgressql,即使光标根据数据库中定义的字段类型进行转换,您也会得到相同的结果。

长话短说,dictfetchall没有进行任何转换,而是从光标解析转换后的结果。