Python将日期存储和检索到Sqlite3数据库

0 投票
1 回答
4530 浏览
提问于 2025-04-18 04:54

我知道在StackOverflow上有一个类似的问题,基本上是在问同样的事情。不过,我似乎遇到了一个错误信息。让我来解释一下。

为了测试如何在Sqlite3数据库中存储和获取Python的日期对象,我写了一个小测试脚本:

import sqlite3
import datetime

conn = sqlite3.connect("test.db")
conn.execute('''CREATE TABLE TEST
            (
             ID     TEXT PRIMARY KEY     NOT NULL,
             DATE    TIMESTAMP
             );''')

conn.commit()

mydate = datetime.date(2014,4,28)
myid = 'test'

conn.execute("INSERT INTO TEST (ID,DATE)\
            VALUES(?,?)",[myid,mydate])
conn.commit()
conn.close()

conn = sqlite3.connect("test.db")
cursor = conn.execute("SELECT ID,DATE from TEST")
for row in cursor:
    retrievedDate = row[1]

print retrievedDate,type(retrievedDate)
conn.close()

这个代码是可以运行的,但取出来的日期是unicode格式。

我从上面的链接了解到,如果不加detect_types=sqlite3.PARSE_DECLTYPES这个参数,sqlite会返回unicode格式。所以,我把代码改成了这样:

...
conn = sqlite3.connect("test.db",detect_types=sqlite3.PARSE_DECLTYPES)
cursor = conn.execute("SELECT ID,DATE from TEST")
for row in cursor:
    retrievedDate = row[1]

print retrievedDate,type(retrievedDate)
...

但是现在它给我报了这个错误信息:

  File "C:\Python27\lib\sqlite3\dbapi2.py", line 66, in convert_timestamp
    datepart, timepart = val.split(" ")
ValueError: need more than 1 value to unpack

这个问题是怎么回事呢?

1 个回答

3

你把这一列声明为时间戳类型:

conn.execute('''CREATE TABLE TEST
            (
             ID     TEXT PRIMARY KEY     NOT NULL,
             DATE    TIMESTAMP
             );''')

改成 DATE 类型会更好;因为 Python 会根据列的类型选择转换器,而 TIMESTAMP 在这里会触发错误的转换器。

示例:

>>> import sqlite3
>>> import datetime
>>> conn = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
>>> conn.execute('''CREATE TABLE TEST (ID TEXT PRIMARY KEY NOT NULL, DATE DATE)''')
<sqlite3.Cursor object at 0x104a5adc0>
>>> conn.commit()
>>> conn.execute("INSERT INTO TEST (ID,DATE) VALUES (?, ?)",
...              ('foo', datetime.date(2014,4,28)))
<sqlite3.Cursor object at 0x104a5ae30>
>>> conn.commit()
>>> cursor = conn.execute("SELECT ID,DATE from TEST")
>>> for row in cursor:
...     print row
... 
(u'foo', datetime.date(2014, 4, 28))

另外,你也可以在 SELECT 查询中用方括号包含类型名称:

cur.execute('SELECT ID, DATE [date] from TEST')

撰写回答