[英]SQLAlchemy returns weird data
我正在嘗試從表中導出日期。 我只想拉出原始創建的對象。
我正在運行以下查詢:
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),)
我如何將創建的值導出為原始字符串?
如果該列是日期時間列,則原始值不是字符串,而是…日期時間。
在大多數數據庫引擎中,在幕后,存儲在數據庫中的datetime列的實際原始值是某種數字。 例如,在Microsoft SQL Server中,IIRC是自1901年以來的64位十微秒整數。但是您不想要該數字。 你會怎么做?
如果您想要某種特定格式的字符串,您當然可以要求數據庫將其格式化為可接受的任何字符串格式,但是為什么呢?
您的引擎和/或SQLAlchemy已將datetime值表示為Python datetime
對象。 與字符串相比,它更小,從數據庫傳遞的速度更快,並且更靈活(例如,您可以使用它們進行比較和算術)。
而且,您始終可以將其格式化為所需的任何字符串格式。 例如:
>>> 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'
… 等等。
SQLAlchemy的查詢的屬性(相對於整個模型)的返回KeyedTuples
它像一個namedtuple 。 像普通的Python元組一樣 ,具有單個元素的元組由尾隨逗號構成。 這就是為什么您的結果(datetime.datetime(2018, 7, 17, 20, 17, 9, 653809),)
在datetime對象后顯示逗號的原因。
>>> 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()
有點令人困惑
應用限制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),)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.