Как читать datetime обратно из sqlite как datetime вместо строки в Python? - программирование
Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Мне нужно было сделать следующее:

  • Передайте параметр sqlite3.PARSE_COLNAMES в вызове .connect(), например.
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", вместо этого он молча игнорируется, и я все равно возвращаю строку. То же самое, если я опускаю кавычки.