Variablen Problem beim schreiben in Tabelle

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
nathan6
User
Beiträge: 17
Registriert: Montag 7. September 2015, 17:25

Hallo,

ich bin noch ziemlich ungeübt im umgang mit Python, habe bis jetzt nur in PHP gearbeitet. Ich versuche gerade in eine Tabelle zu schreiben aber die Variablen machen mir noch Probleme.

Code: Alles auswählen

            cursor = db.cursor()            
            sql = ("""INSERT INTO %s (uan, email, passwd, ual, uam, uad) VALUES (%s, %s, %s, %s, %s, %s)""" % (uname, uan, email, password, ual, uam, uad))
            cursor.execute(sql)
            db.close()	
Und das hier bekomme ich als Output:
  • ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@web.de, xxxxx, 5, 1111111, 1119)' at line 1")
    None
Also ich denke das die erste Variable die den Tabellennamen darstellt, das Problem ist.

Wäre schön wenn mir jemand auf die Sprünge helfen könnte.

Gruß
nathan6
BlackJack

@nathan6: Werte formatiert man nicht selbst als Zeichenketten in eine SQL-Anweisung. Das ist sowohl eine Sicherheitslücke als auch ein potentieller Verlust an Leistung. Für Werte schreibt man entsprechende Platzhalter in die SQL-Anweisung und übergibt die Werte selbst dann als zweites Argument an `execute()`, das sorgt dann für ein sicheres „escapen“ der Werte und löst dabei unter anderem auch den SQL-Syntaxfehler den Du da bekommst.

Der Tabellenname ist kein Wert und der sollte auch nicht variabel sein. Was hast Du denn da für einen Datenbankentwurf gemacht? Das riecht komisch.

Last but not least: Ich verwende mittlerweise eigentlich für jede Anwendung mit Datenbankanbindung SQLAlchemy. Wenn schon nicht als ORM dann wenigstens um wirklich datenbankunabhängig Anfragen programmatisch erstellen zu können ohne von Hand mit irgendwelchen Zeichenketten mit SQL-Fragmenten hantieren zu müssen.
nathan6
User
Beiträge: 17
Registriert: Montag 7. September 2015, 17:25

Hi,

danke für deine schnelle Antwort.
Ich denke mal das du das hier meinst, mit dem zweiten Argument an execute().
Das war mein erster Versuch, nach einer runde Googeln bin ich auf andere Varianten gestossen die aber auch nicht fuktioniert haben.

Code: Alles auswählen

            cursor = db.cursor()            
            sql = ("""INSERT INTO %s (uan, email, passwd, ual, uam, uad) VALUES (%s, %s, %s, %s, %s, %s)""")
            cursor.execute(sql, (uname, uan, email, password, ual, uam, uad))
            db.close()	 
Und Was meinst du mit
Der Tabellenname ist kein Wert und der sollte auch nicht variabel sein. Was hast Du denn da für einen Datenbankentwurf gemacht? Das riecht komisch.
Ich brauche den Tabellennamen aber Variabel beim erstellen den Tabelle klappts ja auch ;-)

Gruß
BlackJack

@nathan6: Der Tabellenname ist in SQL kein Wert, kann also auch nicht per Platzhalter als Wert übergeben werden. Und der Tabellenname sollte nicht variabel sein, das riecht nach einem arg komischen Datenbankentwurf. Denn wenn man sich für ansonsten gleiche Daten die Tabelle dynamisch aussuchen muss, dann sollte in einem vernünftigen Datenbankentwurf nur *eine* Tabelle dafür existieren und der Tabellenname, beziehungsweise das was semantisch den Unterschied zwischen den eigentlich gleich aufgebauten Tabellen ausmacht, gehört als Wert in eine Spalte dieser *einen* Tabelle.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nathan6 hat geschrieben:Ich brauche den Tabellennamen aber Variabel beim erstellen den Tabelle klappts ja auch ;-)
Wenn du die gleiche Tabellenstruktur mehrfach in unterschiedlichen Tabellen verwendest, dann hast du typischerweise ein verkorkstes Datenbankdesign. Wenn du Dinge unterscheiden musst, dann füge der Tabelle eine entsprechende Spalte für das Unterscheidungskriterium hinzu, aber leg sie nicht mehrfach mit unterschiedlichen Namen an.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Zusätzlich zu dem was die anderen gesagt haben: uan, passwd, ual, uam und uad sind sehr schlechte Namen. Bei passwd kann man noch raten das password gemeint ist und dir das Tippen der 2 zusätzlichen Buchstaben einfach zu viel war aber die restlichen Namen sind nichtssagend und damit inakzeptabel.
Antworten