SqlAlchemy 查询属性(而不是整个模型)返回KeyedTuples (or RowSQLAlchemy 1.4 中的对象)其行为类似于命名元组。与普通的 Python 元组一样,tuple单个元素由尾随逗号构成。这就是为什么你的结果(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'
有点令人困惑的是tutorial说.first()
应用 1 的限制并以标量形式返回第一个结果
该示例显示返回的单个对象,如下所示:
>>> 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),)