2016-10-05 3 views
0

Ich bin neu in mySQL mit Python und ich bekomme den allgemeinen 1054 Fehler, wenn ich versuche, eine vorbereitete SQL INSERT-Anweisung auszuführen mit Python-freundlichen Platzhaltern ('% s')SQL Fehler 1054, "Unbekannte Spalte 'xxxxx' in 'Feldliste'" in Python mit Platzhaltern

Ich verstehe die normale Lösung besteht darin, Anführungszeichen anstelle von Back-Ticks hinzuzufügen, oder füge sie hinzu, wenn sie für die eingefügten Werte fehlen, jedoch habe ich eine Überprüfung ausgeführt Die Cols und Vals Tupel und ich kann sehen, dass sie in einfachen Anführungszeichen enthalten sind, also bin ich etwas verwirrt, warum dieser Fehler auftritt.

Unten finden Sie einen Ausschnitt aus meinem Code: (BTW 'Cols' und 'vals' Tupel von Strings (mit Schwerpunkt auf Strings :))

ersten füge ich die Spaltennamen:

for item in cols: 
    try: 
     # First add columns if not already present 
     query = "ALTER TABLE Parameters ADD COLUMN %s VARCHAR(200)" % (str(item)) 

     cursor.execute(query) 
     connection.commit() 
    except: 
     pass 

Dann versuche ich das Hinzufügen der Werte:

sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols))); 
    try: 
     cursor.execute(sql, vals) 

    except Exception as e: 
     print(e) 

    connection.close() 

Manchmal gibt es kein Problem, aber sonst bekomme ich diesen Fehler:

(1054, "Unknown column 'ColumnName' in 'field list'") 

Ist meine Python-Anweisung vollständig falsch, und sind Platzhalter nicht die beste Praxis? Ich verwende Platzhalter, da meine Listen sehr groß sind.

Hier ist eine verdummte Version der SQL-Anweisung drucken.

INSERT INTO Parameters (TestID, Dev_Type, Version, MAC, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DayActNxtDateTime, XXXX) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) 

Und Fehler:

(1054, "Unknown column 'DayActNxtDateTime' in 'field list'") 
+0

Drucken Sie die SQL-Anweisung, nachdem Sie die Variablensubstitution durchgeführt haben. Wenn die Antwort nicht offensichtlich ist, lege das Ergebnis in die Frage. –

+0

Sie können keine Platzhalter für Feldnamen verwenden. –

+0

Hallo @Gordon Linoff, ich kann die Aussage nicht wirklich hinter sich lassen, da es sensible Daten sind, aber ich habe das schon überprüft. Ich füge ein enges Beispiel der Aussage ein, die ich nach dem Drucken habe. – MikG

Antwort

0

scheint, Sie fragen, wie man Schwierigkeiten, das Problem schießen?

INSERT INTO Parameters ({0}) VALUES ({1}) 

Der Fehler berichten, dass in Ihrem ({0}) Sie hat ein Feld „Spaltenname“ genannt, aber es ist nicht in der Tabelle Parameter definiert.

Versuchen:

SHOW CREATE TABLE parameters; 

Und stellen Sie sicher, dass Ihre Tabelle das Feld enthält.

Wenn immer noch Probleme hat, dann drucken Sie alle SQL in Ihre Exception-Handler:

print(e) 
print(sql) 

Dann werde ich tcpdump laufen die SQL-Zeichenfolge, um sicherzustellen, verstümmelt wird nicht zu Unrecht von jeder Bibliothek

sudo tcpdump -A -i lo0 dst port 3306 

Und dann führen Sie Ihr Skript.

0

Dank @Gordon Linoff und @Shuo für alle Ihre Hilfe. Es stellte sich heraus, dass meine heruntergekommene Version der SQL-Anweisung irreführend war. Ich spielte mit dem manuellen Hinzufügen von Spalten direkt über die SQL-Befehlszeile, um die Antwort zu finden.

Es stellte sich heraus, dass einige meiner Spaltennamen die von SQL auferlegte 64-Zeichen-Grenze überschritten haben (diese Spaltennamen werden programmgesteuert generiert), weshalb die Schleife manchmal funktioniert und manchmal nicht. Nicht sicher, ob es einen Weg in SQL gibt, den Spaltentitel zu verkürzen, sah ich nach einem kurzen Blick etwas über eine COMPRESS-Methode?

In der Zwischenzeit habe ich ein Python-Wörterbuch erstellt, um diese extra langen Spaltennamen bei der Erstellung zu erfassen und sie einem manuell erstellten alternativen Wert zuzuordnen. Danke nochmal, dass du mir die Richtung gegeben hast.

Verwandte Themen