如果您在sqlite3.connect
设置detect_types=sqlite3.PARSE_DECLTYPES
, 则连接将尝试SQLite的数据类型,当你画数据从数据库转换为Python数据类型 。
这是因为一件非常好的事情它好得多与datetime对象的工作比 随机日期字符串一样,你再有 datetime.datetime.strptime
或dateutil.parser.parse
解析。
不幸的是,使用detect_types
不会接受 字符串作为DATE数据停止sqlite的,但你会得到一个错误,当您尝试 提取数据从数据库中(如果它是在比其他一些格式的插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 sqlite
cur.execute("INSERT INTO foo(bar) VALUES (?)",('25/06/2003',))
# But you won't be able to draw the data out later because parsing will fail
try:
cur.execute("SELECT * FROM foo")
except ValueError as err:
print(err)
# invalid literal for int() with base 10: '25/06/2003'
conn.rollback()
但至少该错误会提醒你一个事实,即您插入 字符串的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
对象。
Thanks unutbu - 看起来像日期对象是要走的路。问候。 – 2010-11-26 01:17:50