Как прочитать datetime из sqlite как datetime вместо строки в Python?
Я использую модуль sqlite3 в Python 2.6.4 для хранения datetime в базе данных SQLite. Вставить его очень просто, так как sqlite автоматически преобразует дату в строку. Проблема в том, что при чтении он возвращается как строка, но мне нужно восстановить исходный объект datetime. Как мне это сделать?
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 (для столбца, объявленного меткой времени) переживают поездку туда и обратно с типом intact.
оказывается, что 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" вместо этого, он молча игнорируется, и я все равно получаю строку обратно. То же самое, если я опущу цитаты.
Примечание: В Python3 мне пришлось изменить SQL на что-то вроде:
SELECT jobid, startedTime as "st [timestamp]" FROM job
(мне пришлось явно указать столбец.)