如何从SQLite中读取date时间作为date时间而不是Python中的string?

我在Python 2.6.4中使用sqlite3模块来将date时间存储在SQLite数据库中。 插入它非常容易,因为sqlite会自动将date转换为string。 问题是,在阅读它时会返回string,但我需要重build原始的date时间对象。 我该怎么做呢?

如果你用一种时间戳来声明你的列,那么你就是三叶草:

>>> 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(对于一个声明时间戳的列)在types不变的情况下经历了往返。

事实certificate,sqlite3可以做到这一点,它甚至被logging ,types – 但很容易错过或误解。

我所要做的是:

  • 在.connect()调用中传递sqlite3.PARSE_COLNAMES选项,例如。
 conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) 
  • 把我想要的types放到查询中 – 对于datetime,实际上并不是“datetime”,而是“timestamp”:

     sql = 'SELECT jobid, startedTime as "[timestamp]" FROM job' cursor = conn.cursor() try: cursor.execute(sql) return cursor.fetchall() finally: cursor.close() 

如果我通过“date时间”,而不是默默无闻,我仍然得到一个string回来。 同样,如果我省略引号。