【问题标题】:Dates as strings when submitting raw SQL with sqlalchemy使用 sqlalchemy 提交原始 SQL 时将日期作为字符串
【发布时间】:2017-11-30 13:39:00
【问题描述】:

在 SQLAlchemy 中,当我提交选择日期时间属性的原始 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()

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

>>> 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 来解析字符串,但我的问题是

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

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

【问题讨论】:

    标签: python sqlite datetime sqlalchemy


    【解决方案1】:

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

    【讨论】:

    • 所以我的第二个问题的答案是使用除SQLite 之外的任何其他数据库?引用官方文档:“大多数 DBAPI 都内置了对 datetime 模块的支持,但 SQLite 除外”
    • 您可以在使用文本 SQL 时在 SQLAlchemy 中手动提供有关结果列的信息:docs.sqlalchemy.org/en/latest/core/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多