0

我正在尝试从表中导出日期。我只想拉出原始创建的对象。

我正在运行以下查询:

return model.Session.query(cls).filter(cls.issue_id == issue_id).order_by(desc("created")).first()

但它会返回整个记录,我不知道如何导出创建。

<IssueComment id=32 comment=ay user_id=578042a3-d879-4b32-96a9-10f9aabe152c issue_id=19 created=2018-07-17 20:17:09.653809 visibility=visible abuse_status=0>

如果我尝试在 cls.created 中调用 created 这样

return model.Session.query(cls.created).filter(cls.issue_id == issue_id).order_by(desc("created")).first()

它会导出一个奇怪的日期时间版本。我只想要原始版本

(datetime.datetime(2018, 7, 17, 20, 17, 9, 653809),)

如何将创建的值导出为原始字符串?

4

2 回答 2

5

SqlAlchemy 查询属性(而不是整个模型)返回KeyedTuples(或SQLAlchemy 1.4 中的Row对象),其行为类似于namedtuple。与普通的 Python 元组一样,具有单个元素的元组由尾随逗号构成。这就是您的结果(datetime.datetime(2018, 7, 17, 20, 17, 9, 653809),)显示日期时间对象后跟逗号的原因。

>>> row = session.query(User.creation_timestamp).first()
>>> row
(datetime.datetime(2018, 4, 22, 9, 20, 56),)  # <- trailing comma because it's a tuple

可以通过索引访问值

>>> row[0]
datetime.datetime(2018, 4, 22, 9, 20, 56)

或按名称

>>> row.creation_timestamp
datetime.datetime(2018, 4, 22, 9, 20, 56)

这些值是带有所有常用方法的python对象

>>> row.creation_timestamp.isoformat()
'2018-04-22T09:20:56'
>>> str(row.creation_timestamp)
'2018-04-22 09:20:56'

教程说的有点令人困惑.first()

应用一个限制并将第一个结果作为标量返回

该示例显示了返回的单个对象,如下所示:

>>> q = session.query(User).first()
>>> q
<User object at 0x7f97d8c6b590>

而首先通过属性调用您的查询会返回一个包含在元组中的值。如果您将元组视为结果集中的一行,这是有道理的。如果你调用.all()你的查询,你会得到一个元组(行)列表。如果你调用.limit(1).all()你的查询,你会得到一个包含单个元组的列表。所以当你打电话时,.first()你会得到第一个结果.limit(1).all(),这是一个元组。

>>> row = session.query(User.creation_timestamp).all()
>>> row
[(datetime.datetime(2018, 4, 22, 9, 20, 56),), (datetime.datetime(2018, 4, 22, 9, 20, 56),), ...]

>>> row = session.query(User.creation_timestamp).limit(1).all()
>>> row
[(datetime.datetime(2018, 4, 22, 9, 20, 56),)]

>>> row = session.query(User.creation_timestamp).first()
>>> row
(datetime.datetime(2018, 4, 22, 9, 20, 56),)
于 2018-07-18T05:49:55.800 回答
4

如果该列是日期时间列,则原始值不是字符串,而是……嗯,日期时间。

在大多数数据库引擎中,隐藏在数据库中的日期时间列的实际原始值是某种数字。例如,IIRC,在 Microsoft SQL Server 中,它是自 1901 年以来十微秒的 64 位整数。但您不想要那个数字。你会用它做什么?

如果您想要某种特定格式的字符串,您当然可以要求数据库为您将其格式化为它接受的任何字符串格式,但为什么呢?

您的引擎和/或 SQLAlchemy 已将日期时间值表示为 Pythondatetime对象。与字符串相比,它更小、更快速地从数据库中传递,并且更灵活(例如,您可以使用它们进行比较和算术运算)。

而且您始终可以将其格式化为您想要的任何字符串格式。例如:

>>> d = datetime.datetime(2018, 7, 17, 20, 17, 9, 653809)
>>> str(d)
'2018-07-17 20:17:09.653809'
>>> d.isoformat()
'2018-07-17T20:17:09.653809'
>>> d.strftime('%Y%m%d%H%M%S')
'20180717201709'
>>> d.strftime('%m/%d/%Y %I:%M %p%S')
'07/17/18 08:18 PM'

… 等等。

于 2018-07-17T21:16:31.730 回答