我在Python 2.6.4中使用sqlite3模块将日期时间存储在SQLite数据库中。插入它非常容易,因为sqlite自动将日期转换为字符串。问题是,读取时它以字符串形式返回,但是我需要重建原始的datetime对象。我该怎么做呢?
Answers:
如果用时间戳记类型声明列,那么您将处于三叶草中:
>>> db = sqlite3.connect(':memory:', detect_types=sqlite3.PARSE_DECLTYPES)
>>> c = db.cursor()
>>> c.execute('create table foo (bar integer, baz timestamp)')
<sqlite3.Cursor object at 0x40fc50>
>>> c.execute('insert into foo values(?, ?)', (23, datetime.datetime.now()))
<sqlite3.Cursor object at 0x40fc50>
>>> c.execute('select * from foo')
<sqlite3.Cursor object at 0x40fc50>
>>> c.fetchall()
[(23, datetime.datetime(2009, 12, 1, 19, 31, 1, 40113))]
看到?int(对于声明为整数的列而言)和datetime(对于声明为timestamp的列而言)都将保留类型为原样的往返。
u'2012-01-01 18:35:24.617954-02:00'
事实证明,sqlite3可以做到这一点,甚至已有文献记载,但是很容易错过或误解。
我要做的是:
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
将我想要的类型放入查询中-对于datetime,它实际上不是“ datetime”,而是“ timestamp”:
sql = 'SELECT jobid, startedTime as "[timestamp]" FROM job'
cursor = conn.cursor()
try:
cursor.execute(sql)
return cursor.fetchall()
finally:
cursor.close()
如果我传入了“ datetime”,它会被默默地忽略,而我仍然会返回一个字符串。如果省略引号,也是如此。
"[timestamp]"
,会[timestamp]
被静默忽略,.fetchone
也不会转换类型。多么奇怪的图书馆。
as
关键字