type Come leggere datetime back da sqlite come un datetime anziché una stringa in Python?




sqlite timestamp to date (3)

Sto usando il modulo sqlite3 in Python 2.6.4 per archiviare un datetime in un database SQLite. Inserirlo è molto semplice, perché sqlite converte automaticamente la data in una stringa. Il problema è che, leggendolo, torna come una stringa, ma ho bisogno di ricostruire l'oggetto datetime originale. Come faccio a fare questo?


Se dichiari la tua colonna con un tipo di timestamp, sei nel trifoglio:

>>> 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))]

Vedere? sia int (per una colonna dichiarata integer) che datetime (per una colonna dichiarata timestamp) sopravvivono al round-trip con il tipo intatto.


Si scopre che sqlite3 può farlo ed è anche documented , un po '- ma è piuttosto facile perdere o fraintendere.

Quello che dovevo fare è:

  • Passa l'opzione sqlite3.PARSE_COLNAMES nella chiamata .connect (), ad es.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
  • Inserisci il tipo desiderato nella query e per datetime non è in realtà "datetime", ma "timestamp":

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

Se passo in "datetime", invece, viene silenziosamente ignorato e ho ancora una stringa indietro. Lo stesso se ometto le virgolette.


Nota: in Python3, ho dovuto modificare l'SQL in qualcosa di simile:

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

(Dovevo nominare esplicitamente la colonna.)







sqlite3