2016-12-05 7 views
0

Die folgende Tabelle meiner MySQL-Daten des Feldes istVon Python zu MySQL-Upload-Daten fehlgeschlagen

Die Tabelle mit dem Namen infor

+-------------+-------------+------+-----+-------------------+----------------+ 
| Field  | Type  | Null | Key | Default   | Extra   | 
+-------------+-------------+------+-----+-------------------+----------------+ 
| id   | bigint(7) | NO | PRI | NULL    | auto_increment | 
| temperature | varchar(20) | YES |  | NULL    |    | 
| wet   | varchar(20) | YES |  | NULL    |    | 
| created  | timestamp | NO |  | CURRENT_TIMESTAMP |    | 
+-------------+-------------+------+-----+-------------------+----------------+ 

Wenn ich möchte Daten auf meinen MySQL-Server

ich hochladen Mit dem folgenden Code:

temperature_item = '8.7`c' 
wet_item = '0.87%' 
cur.execute("INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)") 

Dann zeigt es den Fehler folgenden:

pymysql.err.InternalError: (1054, "Unknown column 'wet_item' in 'field list'")

Aber wenn ich schreibe:

cur.execute("INSERT INTO infor (temperature,wet) VALUES ('87`c','8.7%')") 

Es könnte funktionieren, und ich habe die vorherige Frage gesucht

Haben füge ich das nicht druckbare Wort? Oder ein anderes Problem?

+0

Haben Sie meine Antwort versucht? – e4c5

+0

thx es hat funktioniert !!! –

+0

Sie sind herzlich willkommen. Ich bin froh, dass ich geholfen habe. Da Sie hier noch neu sind, möchte ich darauf hinweisen, dass die bevorzugte Art, hier "Danke" zu sagen, darin besteht, gute Fragen und hilfreiche Antworten zu wählen (sobald Sie genug Ansehen haben) und die hilfreichste Antwort zu akzeptieren auf jede Frage, die Sie stellen (was auch Ihrem Ruf einen kleinen Schub verleiht). [Wenn jemand antwortet] (http://stackoverflow.com/help/someone-answers) – e4c5

Antwort

1
"INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)" 

Dies ist ein Python string literal. Ihre cur.execute Anweisung entspricht genau der folgenden Eingabe an der mysql-Konsole.

INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item) 

Jetzt haben Sie ein wet_item in mysql definiert? Nein, der obige Fehler ist das Ergebnis. Diese

ist auch ein Stringliteral

"INSERT INTO infor (temperature,wet) VALUES ('87c','8.7%')" 

Aber hier sind Sie vorbei Konstanten zu mysql, die sie mit ganz leicht umgehen können. Wenn Sie Ihre Variable wollte passieren die richtige Form MySQL ist

cur.execute("INSERT INTO infor (temperature,wet) VALUES(%s, %s)", (temperature_item,wet_item)) 
+0

danke !!! Das ist sehr nützlich ^^ aber warum nach dem Ausführen der SQL-Anweisung, der SQL-Server hat keine Daten zu fangen? –

+0

Entschuldigung, ich habe diesen Kommentar nicht verstanden – e4c5

+0

Führen Sie 'cur.commit()' nach Ihrer letzten Abfrage. –

0

Ich weiß nicht, Python sehr gut, aber https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html, wie es scheint, sollten Sie Ihren Parameter übergeben, wenn Sie es ausführen.

Also, wenn Sie dies versuchen:

query = ("INSERT INTO infor (temperature,wet) VALUES (%s,%s)") 
temperature_item = '8.7`c' 
wet_item = '0.87%' 

cursor.execute(query, (temperature_item, wet_item)) 
+0

danke !!! das ist sehr nützlich ^^ aber ich weiß nicht nach dem Ausführen der SQL-Anweisung, der SQL-Server hat keine Daten zu fangen? –

+0

https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-transaction.html, hast du committen? –

0

Python hat keine variable Expansion in Strings. So in

cur.execute("INSERT INTO infor (temperature,wet) VALUES (temperature_item,wet_item)") 

Python tut nicht die Variablennamen ersetzen damit Werte ist. (Wie sollte Python sogar wissen, wenn Sie das wollen?)

Die allgemeine Lösung in Python ist die .format() Methode:

s = "World" 
print("Hello {}".format(s)) 

, die die geschweiften Klammern mit dem Wert von s ersetzt.

jedoch in diesem speziellen Fall (Arbeiten mit Datenbanken) die bessere Lösung ist,

cur.execute("INSERT INTO infor (temperature,wet) VALUES(%s, %s)", (temperature_item,wet_item)) 

es der Weg der DB-Schnittstelle der Variablen Werte einzufügen. Es ist der bessere Weg, denn es ist auch sicher, macht dies nicht geschieht:

temperature_item = "87c" 
wet_item = "8.7%'); DROP TABLE infor; --" 
cur.execute("INSERT INTO infor (temperature,wet) VALUES('{}', '{}')".format(temperature_item, wet_item)) 

, die schlecht wäre.

Verwandte Themen