如果设置
detect_types=sqlite3.PARSE_DECLTYPES为
sqlite3.connect,则当您从数据库中提取数据时,连接将尝试将sqlite数据类型转换为Python数据类型。
这是因为它更漂亮的工作比随机日期字符串一样,你再有解析datetime对象一件非常好的事情
datetime.datetime.strptime或
dateutil.parser.parse。
不幸的是,使用
detect_types并不能阻止sqlite将 字符串作为DATE数据 接受 ,但是当您尝试从数据库中提取数据时(如果以YYYY-
MM-DD以外的其他格式插入数据),将会收到错误消息,因为将无法将其转换为datetime.date对象:
conn=sqlite3.connect(':memory:',detect_types=sqlite3.PARSE_DECLTYPES) cur=conn.cursor()cur.execute('CREATE TABLE foo(bar DATE)')# Unfortunately, this is still accepted by sqlitecur.execute("INSERT INTO foo(bar) VALUES (?)",('25/06/2003',))# But you won't be able to draw the data out later because parsing will failtry: cur.execute("SELECt * FROM foo")except ValueError as err: print(err) # invalid literal for int() with base 10: '25/06/2003' conn.rollback()但是,至少该错误会提醒您,当您确实应该插入datetime.date对象时,已经为DATE插入了一个字符串:
cur.execute("INSERT INTO foo(bar) VALUES (?)",(datetime.date(2003,6,25),))cur.execute("SELECt ALL * FROM foo")data=cur.fetchall()data=zip(*data)[0]print(data)# (datetime.date(2003, 6, 25),)只要您使用YYYY-MM-DD格式,就可以将字符串作为DATE数据插入。请注意,尽管您插入了一个字符串,但它作为一个
datetime.date对象返回:
cur.execute("INSERT INTO foo(bar) VALUES (?)",('2003-06-25',))cur.execute("SELECt ALL * FROM foo")data=cur.fetchall()data=zip(*data)[0]print(data)# (datetime.date(2003, 6, 25), datetime.date(2003, 6, 25))因此,如果您受训只将
datetime.date对象插入
DATE字段,那么以后将数据提取出来就不会有问题。
如果您的用户以各种格式输入日期数据,请检出dateutil.parser.parse。它可能能够帮助您将各种字符串转换为
datetime.datetime对象。



