Как читать datetime обратно из sqlite как datetime вместо строки в Python? - PullRequest
60 голосов
/ 02 декабря 2009

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

Ответы [ 3 ]

103 голосов
/ 02 декабря 2009

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

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

18 голосов
/ 02 декабря 2009

Оказывается, что 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», он молча игнорируется, и я все равно получаю строку назад. То же самое, если я опущу кавычки.

1 голос
/ 24 января 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...