Estoy usando el módulo sqlite3 en Python 2.6.4 para almacenar una fecha y hora en una base de datos SQLite. Insertarlo es muy fácil, porque sqlite convierte automáticamente la fecha en una cadena. El problema es que, al leerlo, vuelve como una cadena, pero necesito reconstruir el objeto datetime original. ¿Cómo hago esto?¿Cómo leer la fecha y hora de vuelta de sqlite como una fecha y hora en vez de una cadena en Python?
¿Cómo leer la fecha y hora de vuelta de sqlite como una fecha y hora en vez de una cadena en Python?
Respuesta
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.
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.
Hm, ¿podría mostrar algo más de código ? Parece que no puedo hacer que esto funcione ... – unutbu
tenga en cuenta que '' [timestamp] "', '[timestamp]' se ignora silenciosamente, y '.fetchone' tampoco convertirá los tipos. Qué biblioteca tan extraña. –
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)
- 1. Cómo convertir una cadena de fecha y hora a una cadena de fecha y hora de la cultura actual
- 2. Como llegar hora y la fecha del sello de fecha y hora en php
- 3. Parche de fecha y hora en Python ...?
- 4. Rieles: Obtenga la hora de una fecha y hora
- 5. Python: obtener la fecha y hora de la última hora
- 6. de fecha y hora
- 7. SQLite Manipulación de fecha/hora
- 8. Python 3: fecha y hora a fecha y hora: ¿de dónde viene esta hora adicional?
- 9. Inserte una tzinfo en fecha y hora
- 10. Fecha y hora en Groovy
- 11. ¿Cómo creo una fecha y hora en Python desde milisegundos?
- 12. Cómo formatear la cadena de fecha y hora en C++
- 13. C++ fecha y hora
- 14. Cómo obtener la fecha y hora del sello de fecha y hora
- 15. ¿Cómo puedo comparar una fecha y una fecha y hora en Python?
- 16. ¿Cómo convierto una fecha de hora de python en una cadena, con fecha de formato legible?
- 17. strftime en una fecha y hora Django produce una hora UTC en la cadena
- 18. ¿Cómo restar una fecha y hora de otra fecha y hora?
- 19. la conversión de una cadena a una cadena con formato de fecha y hora usando Python
- 20. Convierta una cadena a una fecha y hora
- 21. cómo emitir datetime2 como fecha y hora
- 22. Convertir una cadena con la fecha y hora de una fecha
- 23. Formato de fecha y hora
- 24. Fecha y hora en java
- 25. Combina la fecha y la hora cuando la fecha es un DateTime y la hora es una cadena
- 26. Lectura de una fecha y hora en sqlite3
- 27. analizar una fecha y hora ISO en Python
- 28. Conversión de la cadena de fecha y hora de la fecha a la fecha
- 29. Compilar fecha y hora
- 30. C#: Leer/Escribir Fecha y hora desde/en XML
Gracias, Alex, ¡funciona! Esto me sorprende, porque no se menciona el tipo de TIMESTAMP en http://www.sqlite.org/datatype3.html – EMP
@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í! –
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