如何在Python中从SQLite读取为日期时间而非字符串的日期时间?

91 投票
3 回答
64406 浏览
提问于 2025-04-15 16:35

我在用Python 2.6.4的sqlite3模块把日期时间存储到SQLite数据库里。插入数据很简单,因为sqlite会自动把日期转换成字符串。不过,问题是,当我读取这个数据时,它又变成了字符串,但我需要把它还原成原来的日期时间对象。我该怎么做呢?

3 个回答

1

注意:在Python3中,我需要把SQL改成这样:

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

(我需要明确给这个列起个名字。)

31

原来sqlite3可以做到这一点,而且它在文档中也有提到,虽然说得不太清楚,但其实很容易被忽略或者误解。

我需要做的事情是:

  • 在.connect()调用中传入sqlite3.PARSE_COLNAMES这个选项,比如:
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
  • 在查询中放入我想要的类型——对于日期时间来说,实际上不是用“datetime”,而是用“timestamp”:

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

如果我传入“datetime”,它会被默默忽略,最后我还是会得到一个字符串。如果我不加引号也是一样的情况。

126

如果你把你的列声明为时间戳类型,那你就很幸运了:

>>> 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))]

看到了吗?无论是整型(声明为整数的列)还是日期时间型(声明为时间戳的列),在来回传输的过程中,它们的类型都保持不变。

撰写回答