簡體   English   中英

SQLAlchemy返回奇怪的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM