J'ai fait le tour du stockage de la date et de l'heure dans SQLite3 avec l'intention de récupérer les enregistrements à l'aide de comparaisons plus tard, par ex. SELECT * WHERE date1 < date2
J'ai finalement renoncé à essayer de stocker des objets datetime.datetime et j'ai décidé d'utiliser un horodatage UNIX à la place car ils ne sont qu'un int et facile à manipuler, mais je reçois toujours des erreurs.
import sqlite3 as lite
import datetime
import time
conn = lite.connect('dispatcher.db')
cur = conn.cursor()
query = "create table if not exists new_test (curent_dt)"
cur.execute(query)
conn.commit()
now = datetime.datetime.now() - datetime.timedelta(minutes=60)
temp = int(time.mktime(now.timetuple()))
cur.execute('insert into new_test (curent_dt) values (? )', (temp))
conn.commit()
conn.close()
renvoie l'erreur suivante:
cur.execute ('insérer dans new_test (curent_dt) values (?)', (temp)) ValueError: les paramètres sont de type non pris en charge
Après avoir étudié le problème un peu plus loin, j'ai constaté que vous devez utiliser une virgule de fin pour créer un seul élément Tuple, par exemple. (temp,)
Notez la virgule ajoutée après "temp" ci-dessous:
cur.execute('insert into new_test (curent_dt) values (?)', (temp,))
La raison pour laquelle cela se produit est que (temp)
est un entier mais (temp,)
est un tuple de longueur contenant temp
.
cur.execute('insert into new_test (curent_dt) values (? )', (temp))
Remplacez ce code par
cur.execute('insert into new_test (curent_dt) values (? )', (temp,))
En Python, (temp) et (temp,) sont deux choses différentes. (temp) est juste une variable normale comme entier mais (temp,) est un Tuple. Le tuple n'est pris qu'en fournissant des virgules après chaque élément et la méthode execute () ne prend que des tuples dans son deuxième paramètre.