web-dev-qa-db-fra.com

paramètre non pris en charge lors de l'insertion de int dans sqlite

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

46
Tim McDonald

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.

74
Alex Flint
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.

5
Gurbaksh Singh