如何将Python datetime对象插入Sqlite数据库,并在查询时作为datetime对象检索?

4
为什么将datetime类型插入Sqlite数据库后会丢失?
import sqlite3, datetime
dbconn = sqlite3.connect(':memory:')
c = dbconn.cursor()
c.execute('create table mytable(title text, t timestamp)')

c.execute('insert into mytable (title, t) values (?, ?)', ("hello2", datetime.datetime(2018,3,10,12,12,00)))

c.execute("select * from mytable")
for a in c.fetchall(): 
    print a[0]            # hello2
    print type(a[0])      # <type 'unicode'>
    print a[1]            # 2018-03-10 12:12:00
    print type(a[1])      # <type 'unicode'>

插入和查询后,datetime类型不应该改变吗?

注:由于这个问题,我浪费了将近一个小时的时间,所以现在我将使用“自问自答-分享您的知识,问答式”SO功能发布答案。

注意:这不是邻居问题的重复,因为它不涉及datetime如何存储/检索的问题。

2个回答

2
根据这份文档,解决方案是使用detect_types参数:
dbconn = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)

那么前面代码的输出将是:

hello2
<type 'unicode'>
2018-03-10 12:12:00
<type 'datetime.datetime'>

此外,这是关于Sqlite中日期时间的一个重要说明

SQLite没有专门用于存储日期和/或时间的存储类。相反,SQLite内置的日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER值:

  • TEXT格式为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • REAL格式为儒略日数字,即根据普通格里高利历,在4714年11月24日格林威治正午之后的天数。
  • INTEGER格式为Unix时间,即自1970年01月01日00:00:00 UTC以来的秒数。

应用程序可以选择使用任何这些格式存储日期和时间,并使用内置的日期和时间函数自由地在各种格式之间进行转换。


0
请用户输入日期时间:(例如,“2005年6月1日下午1:33”)
date_entry = input('Enter a date in YYYY-MM-DD h:m am/pm format')

将其转换为日期时间对象:

date1 = datetime.strptime(date_entry, '%b %d %Y %I:%M%p')

插入数据到 SQL 数据表中:

insert table1 (dateField)
   values (convert(datetime,date1,5));

如果您需要在从 SQL 读取后再次进行转换

datetime_object = datetime.strptime(dateField, '%b %d %Y %I:%M%p')

你如何创建数据表?使用你的代码,日期时间将被存储为字符串,然后在查询后需要解析字符串,是这样吗? 我认为我们可以避免使用日期转换为字符串格式,然后再进行解析,可以使用此解决方案 - Basj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接