使用sqlalchemy提交原始SQL时,日期为字符串

时间:2017-06-27 13:17:25

标签: python sqlite datetime sqlalchemy

在SQLAlchemy中,当我提交选择datetime属性的原始SQL查询时,日期将作为字符串返回。但是,当我使用Table.select方法而不是原始SQL时,日期被正确格式化为datetime.datetime对象。

这是一个最小的例子:

import sqlalchemy as sa

eng = sa.create_engine('sqlite:///:memory:')
meta = sa.MetaData()
foos = sa.Table('foos', meta,
                sa.Column('id', sa.Integer, primary_key=True),
                sa.Column('created_at', sa.DateTime))
meta.create_all(eng)
conn = eng.connect()

现在,当我们使用面向对象的appraoch进行查询时:

>>> dict(conn.execute(foos.select()).fetchone())
{'id': 1, 'created_at': datetime.datetime(2017, 6, 1, 11, 0)}

那是datetime.datetime。然而,使用原始SQL:

>>> dict(conn.execute('select * from foos').fetchone())
{'id': 1, 'created_at': '2017-06-01 11:00:00.000000'}

这是一个字符串。 (尽管整数属性id被识别为!)

我知道我可以使用datetime.strptime来解析字符串,但我的问题是

  • 为什么我会收到一个字符串?
  • 我可以使用原始SQL让sqlalchemy给我一个日期时间吗?如果是这样,怎么样?

注意:我知道this related thread,但它没有回答我的问题。

1 个答案:

答案 0 :(得分:2)

您使用SQLite作为DB,日期和时间类型存储为strings,当您使用raw SQL时,查询结果将采用字符串格式,但是,当您使用sqlalchemy时,日期和时间类型将存储为字符串,然后在返回行时将其转换回datetime个对象。请参阅有关sqlalchemy.types.DateTime的官方文档。