如何从SQLite中从sqlite读取日期时间而不是Python中的字符串?


72

我在Python 2.6.4中使用sqlite3模块将日期时间存储在SQLite数据库中。插入它非常容易,因为sqlite自动将日期转换为字符串。问题是,读取时它以字符串形式返回,但是我需要重建原始的datetime对象。我该怎么做呢?

Answers:


113

如果用时间戳记类型声明列,那么您将处于三叶草中:

>>> 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的列而言)都将保留类型为原样的往返。


5
谢谢,亚历克斯,行得通!我感到意外,因为在所有上没有时间戳型的提sqlite.org/datatype3.html
EMP

16
@Evgeny,请参阅docs.python.org/library/…-在sqlite.org中没有记录,因为它实际上是在Python层中实现的,而不是在sqlite本身中实现的!
亚历克斯·马特利

18
我只是发现是使fetchall返回日期时间的connect函数的detect_types = sqlite3.PARSE_DECLTYPES参数。如果您省略它,将有一个unicode对象。
Ponytech

5
好像失败时区的感知价值一样u'2012-01-01 18:35:24.617954-02:00'
圣保罗Scardine

10
TIMESTAMP工作而不是DATETIME的工作原理是什么?
Ciro Santilli郝海东冠状病六四事件法轮功

26

事实证明,sqlite3可以做到这一点,甚至已有文献记载,但是很容易错过或误解。

我要做的是:

  • 在.connect()调用中传递sqlite3.PARSE_COLNAMES选项,例如。
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”,它会被默默地忽略,而我仍然会返回一个字符串。如果省略引号,也是如此。


4
请注意,它肯定是"[timestamp]",会[timestamp]被静默忽略,.fetchone也不会转换类型。多么奇怪的图书馆。
亚当·巴克斯特

看来真正重要的是双引号字符,既不是您明确指定的别名,也不是as关键字
John Wang 2001年

我现在已经提交了bugs.python.org/issue35145'sqlite3:“ select *”应该自动转换日期时间字段“。
罗伯·波拉克

1

注意:在Python3中,我不得不将SQL更改为以下内容:

SELECT jobid, startedTime as "st [timestamp]" FROM job

(我必须明确命名该列。)


正如@AdamBaxter所说,真正重要的是双引号字符,既不是您明确指定的别名也不是as关键字。例如,这可以正常工作:SELECT jobid, startedTime "[timestamp]" FROM job
John Wang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.