我正在使用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并转换某些字段?
答案 0 :(得分:1)
我相信这是使用任何界面驱动程序的标准转换。 即使使用py-postgressql,即使光标根据数据库中定义的字段类型进行转换,您也会得到相同的结果。
长话短说,dictfetchall没有进行任何转换,而是从光标解析转换后的结果。