Mise à jour
Vous pouvez simplifier le code comme suit:
from datetime import datetime
date = datetime.now().date()
sql = "INSERT INTO xtrasmall (%s, Date) values (?, ?)" % record['Color']
c.execute(sql, (record['quantity'], date))
Cela remplace la valeur de la couleur sélectionnée directement dans les noms de colonnes dans la chaîne de requête. Ensuite, la requête est exécutée en transmettant la chaîne de quantité et de date en tant qu'arguments. La date doit automatiquement être convertie en une chaîne, mais vous pouvez convertir avec str()
si vous le souhaitez.
Ceci suppose que les autres colonnes de couleur ont une valeur par défaut (vraisemblablement 0), ou autorisent des valeurs nulles.
réponse originale
Parce que vous construisez la requête avec interpolation de chaîne (par exemple en remplaçant %s
une chaîne) votre déclaration devient quelque chose comme ceci:
INSERT INTO xtrasmall (Red,2017-10-06) values(?)
qui n'est pas valide car 2017-10-06
n'est pas un nom de colonne valide. Imprimez stment
avant de l'exécuter pour voir.
Si vous savez ce que les noms de colonnes sont les spécifier que dans la requête:
values = ['Red', 2, Date]
c.execute("INSERT INTO xtrasmall (color, quantity, date) values (?, ?, ?)", values)
conn.commit()
Vous devez utiliser une ?
pour chaque colonne que vous insérez.
Il semble que vous souhaitiez insérer le dictionnaire en utilisant ses clés et ses valeurs. Cela peut se faire comme ceci:
record = {'date':'2017-10-06', 'color': 'Red', 'quantity': 2}
columns = ','.join(record.keys())
placeholders = ','.join('?' * len(record.values()))
sql = 'INSERT INTO xtrasmall ({}) VALUES ({})'.format(columns, placeholders)
c.execute(sql, record.values())
Ce code génère l'instruction SQL paramétrées:
INSERT INTO xtrasmall (date,color,quantity) VALUES (?,?,?)
puis l'exécuter en utilisant les valeurs du dictionnaire que les paramètres.
Voir http://www.sqlite.org/datatype3.html#datetime. –