2009-12-02 13 views

risposta

91

Se si dichiara la colonna con un tipo di timestamp, sei in 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))] 

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

+4

Grazie, Alex, funziona! Sono sorpreso da questo, perché non c'è alcuna menzione del tipo TIMESTAMP su http://www.sqlite.org/datatype3.html – EMP

+15

@Evgeny, vedi http://docs.python.org/library/sqlite3 .html # default-adapters-and-converters - non è documentato su sqlite.org perché è effettivamente implementato nel livello Python, non in sqlite stesso! –

+12

Ho appena scoperto che è il parametro __detect_types = sqlite3.PARSE_DECLTYPES__ della funzione connect che fa restituire a un datetime. Se lo ometti, avrai un oggetto unicode. – Ponytech

17

Si scopre che sqlite3 può fare questo ed è anche documented, una specie di - ma è piuttosto facile perdere o fraintendere.

Quello che ho dovuto fare è:

  • Passare i sqlite3.PARSE_COLNAMES opzione nella chiamata .connect(), ad esempio.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) 
  • messo il tipo che volevo 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 passassi in "datetime", invece, viene silenziosamente ignorato e ottengo ancora una stringa indietro. Lo stesso se ometto le virgolette.

+0

Hm, sarebbe si prega di mostrare un po 'di codice ? Non riesco a farlo funzionare ... – unutbu

+2

nota che è decisamente '" [timestamp] "', '[timestamp]' viene silenziosamente ignorato, e '.fetchone' inoltre non converte i tipi. Che biblioteca strana. –

1

Nota: In python3, ho dovuto cambiare il codice SQL in qualcosa di simile:

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

(. Ho dovuto nominare esplicitamente la colonna)

Problemi correlati