Как читать datetime обратно из sqlite как datetime вместо строки в Python?


Я использую модуль sqlite3 в Python 2.6.4 для хранения datetime в базе данных SQLite. Вставить его очень легко, потому что sqlite автоматически преобразует дату в строку. Проблема в том, что при чтении он возвращается как строка, но мне нужно восстановить исходный объект datetime. Как мне это сделать?

3 57

3 ответа:

Если вы объявите свой столбец с типом метки времени, вы в Клевере:

>>> 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 (для столбца, объявленного меткой времени) выживают в цикле с неповрежденным типом.

оказывается, что sqlite3 может это сделать, и это даже документирована, вид - но это довольно легко пропустить или неправильно понять.

что я должен был сделать это:

  • передать sqlite3.PARSE_COLNAMES опция в поле .connect () вызов, например.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
  • введите тип, который я хотел в запрос - и для datetime, это на самом деле не "datetime", но "метка времени":

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

Если я передаю "datetime" вместо этого он молча игнорируется, и я все еще получаю строку обратно. То же самое, если я опущу кавычки.

Примечание: В Python3 мне пришлось изменить SQL на что-то вроде:

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

(мне пришлось явно указать столбец.)