Variabler Wert lässt sich nicht in maria-DB eintragen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Hallo ihr Experten,

mich würde interessieren, was an meinem Skript hier falsch ist. Ich habe es mehr oder weniger direkt von einem Beispiel aus dem Internet übernommen, dennoch läuft es nicht.

Es geht einfach darum, in eine Testtabelle einer mariaDB-Datenbank einen Wert per Variable einzufügen. Das Ganze sieht so aus:

Code: Alles auswählen

db_connection = mariadb.connect(user="michi", password="geheim", database ="Datenbank1", host="localhost", port="3306")

cursor = db_connection.cursor()

cursor.execute("USE Datenbank1")

cursor.execute("SHOW TABLES")
for x in cursor:
        print(x)


sql = "INSERT INTO test (wert) VALUES (%s)"
val = ("hi")
cursor.execute(sql, val)
db_connection.commit()
Wenn ich einen festen Wert in das SQL-Statement schreibe, dann funktioniert es. Folgende Fehlermeldungen erscheinen:

Code: Alles auswählen

Traceback (most recent call last):
  File "db_test.py", line 49, in <module>
    cursor.execute(sql, val)
  File "/home/pi/.local/lib/python3.7/site-packages/mysql/connector/cursor.py", line 577, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/home/pi/.local/lib/python3.7/site-packages/mysql/connector/connection.py", line 695, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/home/pi/.local/lib/python3.7/site-packages/mysql/connector/connection.py", line 582, in _handle_result
    raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%s)' at line 1
Das Ganze ist relativ nichtssagend. Ich verstehe auch echt nicht, was ich falsch gemacht habe... Habe auch schon das sql-statement hinten mit Strichpunkt versehen - auch das ohne Erfolg. Ich würde mich über Ratschläge sehr freuen.

Viele Grüße
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Traceback verweist auf eine Zeile 49 in deinem Code, dein Beispiel ist aber wesentlich kürzer. Dadurch kann man es nicht so leicht nachvollziehen wo genau das Problem ist.

Mit fällt allerdings folgendes in Auge:

Code: Alles auswählen

val = ("hi")
Hier fehlt ein Komma um daraus ein Tuple zu machen, so ist es nur ein String und äquivalent zu `val = "hi"`. Ich könnte mir vorstellen dass es deswegen zu dem Fehler kommt.
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Danke dir erstmal für deine Antwort. Das mit dem Tupel kann schon eine Idee sein, aber es muss halt nur ein Wert rein (Tabelle hat nur eine Spalte)

Habe mal den Code gekürzt, so dass die Zeilennummern nun stimmen müssten:

Code: Alles auswählen

import mysql.connector as mariadb

db_connection = mariadb.connect(user="michi", password="geheim", database ="Datenbank1, host="localhost", port="3306"

cursor = db_connection.cursor()

cursor.execute("USE Datenbank1")

cursor.execute("SHOW TABLES")
for x in cursor:
        print(x)


sql = "INSERT INTO test (wert) VALUES (%s)"
val = ("hi")
cursor.execute(sql, val)
db_connection.commit()
Die Fehlermeldungen:

Code: Alles auswählen

Traceback (most recent call last):
  File "db_test.py", line 16, in <module>
    cursor.execute(sql, val)
  File "/home/pi/.local/lib/python3.7/site-packages/mysql/connector/cursor.py", line 577, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/home/pi/.local/lib/python3.7/site-packages/mysql/connector/connection.py", line 695, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/home/pi/.local/lib/python3.7/site-packages/mysql/connector/connection.py", line 582, in _handle_result
    raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%s)' at line 1
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist völlig egal, ob Du einen oder hundert Werte hast, execute erwartet ein Tuple (oder Liste) und keinen String als zweites Argument.
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Ok, dann müsste ich meine Variable also erst in eine Liste hinzufügen und diese Liste dann übergeben?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das hat ja DasIch schon geschrieben, für ein Tuple fehlt ein Komma:

Code: Alles auswählen

val = ("hi",)
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Ach so, ok. Super, jetzt hab ichs hingekriegt. Vielen Dank euch beiden!
Antworten