栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQLite日期存储和转换

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQLite日期存储和转换

如果设置

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
对象。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516768.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号