将日期时间插入 SQLite 数据库

use*_*949 5 sqlite datetime python-3.x

我正在尝试将时间插入到我的数据库中,但是当我打印插入的内容时,它是不正确的。我在将它插入数据库之前打印了时间变量,它是“12:01:09.149059”。当我使用strftime时它工作正常,但我因为时间关闭而切换。

from datetime import datetime
time = str(datetime.now().time())
cur.execute("insert into apple values (?,?,?)",(price,time,date))
con.commit()

#prints:
>>>('132.75', "<method 'time' of 'datetime.datetime' objects>", 'Apr 27, 2015')
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 5

sqlite3模块已经为datetime.datetime对象提供了适配器。您可以按原样传递datetime.datetime,对象:datetime.date

>>> import sqlite3
>>> from datetime import datetime, timezone
>>> db = sqlite3.connect(':memory:')
>>> db.execute('select ?', (datetime.now(timezone.utc),)).fetchone()
('2015-04-27 20:22:26.951841+00:00',)
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以定义自己的适配器,例如传递datetime.time对象:

>>> from datetime import time as datetime_time
>>> def adapt_time(t):
...     return str(t)
... 
>>> sqlite3.register_adapter(datetime_time, adapt_time)
>>> db = sqlite3.connect(':memory:')
>>> db.execute('select ?', (datetime.now(timezone.utc).time(),)).fetchone()
('20:24:00.867221',)
Run Code Online (Sandbox Code Playgroud)

将日期和时间存储在一起(只需传递datetime对象而不进行任何转换)。使用 UTC 时间或感知日期时间对象。

  • 您不想插入日期时间感知对象。它们将被存储为纯字符串,几周后,您最终会摸不着头脑,为什么查询中的比较无法正常工作(当您跨时区进行比较时,字典顺序被破坏)。唯一安全的方法是转换为 UTC 并存储在 https://sqlite.org/lang_datefunc.html#time_values 的变体之一中(并且始终是相同的!)。这种转换可以在插入时使用 SQLite 内置函数“datetime”来实现。 (2认同)

Tim*_*sen 2

您正在尝试将 Python 方法对象转换为字符串,该字符串默认为其表示形式,但您不希望这样做。试试这个:

from datetime import datetime
time = datetime.now().strftime("%B %d, %Y %I:%M%p")
cur.execute("insert into apple values (?,?,?)",(price,time,date))
con.commit()

#prints:
>>>('132.75', "Apr 27, 2015 09:38AM", 'Apr 27, 2015')
Run Code Online (Sandbox Code Playgroud)