【问题标题】:Inserting datetime into a SQLite Database将日期时间插入 SQLite 数据库
【发布时间】:2015-04-27 16:08:41
【问题描述】:

我正在尝试将时间插入到我的数据库中,但是当我打印插入的内容时它不正确。我在将时间变量插入数据库之前打印了它,它是“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')

【问题讨论】:

  • 输出与代码不对应。在您的实际代码中,您在.time 之后缺少()

标签: sqlite datetime python-3.x


【解决方案1】:

sqlite3 模块已经为datetime.datetime 对象提供了适配器。您可以按原样传递datetime.datetimedatetime.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',)

你可以define your own adapters if necessary 例如,传递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',)

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

【讨论】:

  • 您不想插入日期时间感知对象。它们将被存储为纯字符串,几周后,您最终会摸不着头脑,为什么您的查询中的比较不能正常工作(当您跨时区比较时,字典顺序会被破坏)。唯一安全的方法是转换为 UTC 并存储在 sqlite.org/lang_datefunc.html#time_values 的一个变体中(并且始终是同一个!)。这种转换可以在插入时使用 SQLite 内置函数 datetime 来实现。
  • @MartinCejp:这取决于您的用例。如果您希望比较起作用并且您不需要在您的情况下存储原始 utc 偏移量,那么存储“自纪元以来的秒数”可能会更简单(aware_dt.timestamp())。
  • 当然,它也会占用更少的磁盘空间(如果存储在具有数字亲和性的列中)。但是,您会失去直观浏览数据的便利性。
【解决方案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')

【讨论】:

  • 您不需要手动转换datetime对象; sqlite3 提供默认适配器。
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 2023-04-04
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多