J'utilise le module sqlite3 de Python 2.6.4 pour stocker une date / heure dans une base de données SQLite. Il est très facile de l'insérer, car sqlite convertit automatiquement la date en chaîne. Le problème est que, lorsque vous le lisez, il revient sous forme de chaîne, mais je dois reconstruire l'objet datetime d'origine. Comment puis-je faire cela?
Réponses
Trop de publicités?Si vous déclarez votre colonne avec un type d'horodatage, vous êtes dans le trèfle:
>>> 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))]
Voir? int (pour une colonne déclarée entière) et datetime (pour une colonne déclarée timestamp) survivent à l'aller-retour avec le type intact.
Il s'avère que sqlite3 peut le faire, et c'est même documenté, genre de mais il est assez facile de manquer ou de ne pas comprendre.
Ce que j'avais à faire:
- Passer le sqlite3.PARSE_COLNAMES option dans le .appel connect (), par exemple.
conn = sqlite3.connect(dbFilePath, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
-
Mettre le type que je voulais dans la requête et pour le type datetime, ce n'est pas vraiment "datetime", mais "timestamp":
sql = 'SELECT jobid, startedTime as "[timestamp]" FROM job' cursor = conn.cursor() try: cursor.execute(sql) return cursor.fetchall() finally: cursor.close()
Si je passe en "datetime" c'est plutôt ignorées silencieusement et je reçois toujours une chaîne de retour. Même si je omettre les guillemets.