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),)