I'm using the sqlite3 module in Python 2.6.4 to store a datetime in a SQLite database. Inserting it is very easy, because sqlite automatically converts the date to a string. The problem is, when reading it it comes back as a string, but I need to reconstruct the original datetime object. How do I do this?
+1
A:
It turns out that sqlite3 can do this and it's even documented, kind of - but it's pretty easy to miss or misunderstand.
What I had to do is:
- Pass the sqlite3.PARSE_COLNAMES option in the .connect() call, eg.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
Put the type I wanted into the query - and for datetime, it's not actually "datetime", but "timestamp":
sql = 'SELECT jobid, startedTime as "[timestamp]" FROM job' cursor = conn.cursor() try: cursor.execute(sql) return cursor.fetchall() finally: cursor.close()
If I pass in "datetime" instead it's silently ignored and I still get a string back. Same if I omit the quotes.
Evgeny
2009-12-02 00:51:38
Hm, would you please show some more code? I can't seem to get this to work...
unutbu
2009-12-02 01:30:31
+6
A:
If you declare your column with a type of timestamp, you're in clover:
>>> 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))]
See? both int (for a column declared integer) and datetime (for a column declared timestamp) survive the round-trip with the type intact.
Alex Martelli
2009-12-02 03:33:05
Thanks, Alex, it works! I'm surprised by this, because there is no mention of the TIMESTAMP type at all on http://www.sqlite.org/datatype3.html
Evgeny
2009-12-02 23:11:49
@Evgeny, see http://docs.python.org/library/sqlite3.html#default-adapters-and-converters -- it's not documented at sqlite.org because it's actually implemented in the Python layer, not in sqlite itself!
Alex Martelli
2009-12-03 01:44:38