2017-10-05 5 views
0

Je suis novice en programmation. J'ai dictionary appelé enregistrement, qui reçoit diverses entrées comme «Couleur», «Type» «quantité», etc. Maintenant, j'ai essayé d'ajouter une colonne Date puis d'insérer dans la table sqlite en passant par la 'if loop' avec le code ci-dessous. Mais je reçois une "erreur opérationnelle près de 2017", c'est à dire près de la date.Python sqlite3 - operationalerror near "2017"

Quelqu'un peut-il vous aider s'il vous plaît? Merci à l'avance

Date = str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d')) 

record['Date'] = Date 

column = [record['Color'], Date] 

values = [record['quantity'], record['Date']] 

column = ','.join(column) 

if record['Type'] == 'T-Shirts' and record['Style'] == 'Soft': 

    stment = ("INSERT INTO xtrasmall (%s) values(?)" %column) 
    c.execute(stment, values) 
    conn.commit() 
+0

Voir http://www.sqlite.org/datatype3.html#datetime. –

Répondre

0

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.

+0

Merci pour la réponse. Et j'ai votre explication. Je l'avais imprimé pour voir à quoi cela ressemblait. Mais les noms de colonne sont une liste déroulante dans une application tkinter gui. Donc, selon le nom choisi, il est inséré dans la table avec la date, d'où l'interpolation de la chaîne. Y a-t-il un moyen de contourner cela? – TBright

+0

@TBright: la deuxième moitié de ma réponse devrait vous aider avec cela. Vous devez veiller à ce que toutes les colonnes requises soient sélectionnées dans l'interface utilisateur. – mhawke

+0

J'ai essayé mais ça n'a pas marché. Ma table n'a qu'une colonne de date et les colonnes restantes sont des couleurs.Les champs d'entrée dans la table sont la quantité qui sera reçue de l'interface utilisateur, puis elle recherche la couleur particulière sélectionnée et l'enregistre sous cette colonne avec la date. Quand j'ai essayé votre réponse, j'ai essayé de chercher des colonnes qui ne sont pas dans ma table. – TBright