2017-08-14 103 views
3

我有一個從API獲取的日期。它的形式是2015-01-01T15:04:23Z在Flask-SQLAlchemy中使用ISO時間戳

如何使用Flask-SQLAlchemy將此日期接收到模型中?

到目前爲止,我已經試過了,

date = db.Column(db.DateTime) 

date = db.Column(db.DateTime(timezone=True)) 

它給我的錯誤

StatementError: (exceptions.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input. 

此外,當我使用get找回它,我需要它以完全相同的格式。

dateutil這個dateutil python模塊解析得很好,但是當我從表中檢索它時,我需要得到2015-01-01T15:04:23Z

>>> from dateutil.parser import parse 
>>> parse('2015-01-01T15:04:23Z') 
datetime.datetime(2015, 1, 1, 15, 4, 23, tzinfo=tzutc()) 
+1

「的SQLite DateTime類型只接受Python的日期時間」,它解析爲Python DateTime對象日en:https://stackoverflow.com/questions/127803/how-to-parse-an-iso-8601-formatted-date。 –

+0

@IljaEverilä如何在取回後以相同的格式恢復? –

+0

有問題的格式是ISO 8601. Python對它的支持有點欠佳。有[datetime.isoformat()'](https://docs.python.org/3/library/datetime.html#datetime.datetime.isoformat)用於將日期時間對象格式化爲ISO 8601字符串,但會例如,不允許您使用UTC的簡寫「Z」(反正這不算什麼大事)。在Python中所有的日期時間處理都有點痛苦,特別是如果涉及時區的話。 –

回答

1

您需要將字符串轉換成一個Python DateTime對象,你可以使用time.strptime做到:

record.date = time.strptime(mytime, "%Y-%m-%dT%H:%M:%SZ") 

然後你就可以放心地將其放置在您的實例並提交。

拿回來以相同的格式,在另一邊使用time.strftime

time.strftime("%Y-%m-%dT%H:%M:%SZ", record.date) 

,當然還有記得留意的是,中參數的順序是strptimestrftime :)

之間的不同

如果您需要更改/更新的格式,請參閱time.strftime這裏:https://docs.python.org/2/library/time.html

+0

'time.strptime'生成'time.struct_time'實例,而不是'datetime.datetime'。 SQLAlchemy SQLite方言不會很高興。 –