2009-12-02 7 views

Respuesta

91

Si declara la columna con un tipo de marca de tiempo, que está en el trébol:

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

Ver? tanto int (para una columna declarada como entero) como datetime (para una columna declarada como timestamp) sobreviven al viaje de ida y vuelta con el tipo intacto.

+4

Gracias, Alex, ¡funciona! Esto me sorprende, porque no se menciona el tipo de TIMESTAMP en http://www.sqlite.org/datatype3.html – EMP

+15

@Evgeny, consulte http://docs.python.org/library/sqlite3. .html # default-adapters-and-converters - no está documentado en sqlite.org porque en realidad está implementado en la capa de Python, ¡no en sqlite en sí! –

+12

Acabo de descubrir que es el parámetro __detect_types = sqlite3.PARSE_DECLTYPES__ de la función de conexión que hace que fetchall devuelva una fecha y hora. Si lo omites, tendrás un objeto Unicode. – Ponytech

17

Resulta que sqlite3 puede hacer esto y es incluso documented, más o menos - pero es bastante fácil pasar por alto o malinterpretar.

Lo que tenía que hacer es:

  • pasar los sqlite3.PARSE_COLNAMES opción en la llamada .Connect(), por ejemplo.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) 
  • Ponga el tipo que quería en la consulta - y de fecha y hora, en realidad no es "fecha y hora", pero "marca de tiempo":

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

Si paso el "datetime" en lugar de eso, se ignora silenciosamente y aún recibo una cadena. Lo mismo si omito las comillas.

+0

Hm, ¿podría mostrar algo más de código ? Parece que no puedo hacer que esto funcione ... – unutbu

+2

tenga en cuenta que '' [timestamp] "', '[timestamp]' se ignora silenciosamente, y '.fetchone' tampoco convertirá los tipos. Qué biblioteca tan extraña. –

1

Nota: En python3, tuve que cambiar el SQL para algo como:

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

(. Tuviera que nombrar explícitamente la columna)

Cuestiones relacionadas