【问题标题】:Using ISO timestamp in Flask-SQLAlchemy在 Flask-SQLAlchemy 中使用 ISO 时间戳
【发布时间】:2018-01-22 04:30:28
【问题描述】:

我有一个从 API 获得的日期。格式为2015-01-01T15:04:23Z

如何在使用 Flask-SQLAlchemy 的模型中接受这个日期?

到目前为止,我已经尝试过了,

date = db.Column(db.DateTime)

date = db.Column(db.DateTime(timezone=True))

这给了我错误

StatementError: (exceptions.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input.

另外,当我使用get 检索它时,我需要它采用完全相同的格式。

dateutil python 模块可以很好地解析它,但是当我从表中检索它时,我需要得到2015-01-01T15:04:23Z

>>> from dateutil.parser import parse
>>> parse('2015-01-01T15:04:23Z')
datetime.datetime(2015, 1, 1, 15, 4, 23, tzinfo=tzutc())

【问题讨论】:

  • "SQLite DateTime 类型只接受 Python 日期时间",然后将其解析为 Python 日期时间对象:stackoverflow.com/questions/127803/…
  • @IljaEverilä 检索后如何以相同的格式恢复它?
  • 所讨论的格式是 ISO 8601。Python 对它的支持有些欠佳。 datetime.isoformat() 用于将日期时间对象格式化为 ISO 8601 字符串,但这不允许您使用 UTC 的简写“Z”,例如(这并不是什么大事)。总而言之,在 Python 中处理日期时间有点痛苦,尤其是在涉及时区的情况下。

标签: python flask sqlite sqlalchemy schema


【解决方案1】:

您需要将字符串转换为 Python 日期时间对象,您可以使用 time.strptime

 record.date = time.strptime(mytime, "%Y-%m-%dT%H:%M:%SZ")

然后您可以安全地在您的实例上设置它并提交它。

要以相同的格式恢复,请在另一侧使用time.strftime

time.strftime("%Y-%m-%dT%H:%M:%SZ", record.date)

当然要注意strptimestrftime 之间的参数顺序不同:)

如果您需要更改/更新格式,请在此处查看time.strftimehttps://docs.python.org/2/library/time.html

【讨论】:

  • time.strptime 产生 time.struct_time 实例,而不是 datetime.datetime。 SQLAlchemy SQLite 方言不会高兴。
  • .strptime() 适用于 3.8 及更高版本docs.python.org/3/library/…
猜你喜欢
  • 2013-03-11
  • 2021-03-05
  • 2023-04-11
  • 2013-12-06
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多