MySQLdb/Verständnisproblem

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

Hallo,

ich bin ein Python newbie und probiere mich gerade mit verschiedenen Dingen innerhalb Pythons anzufreunden. Jetzt bin ich auf ein Problem gestossen welches ich auch nach stundenlangem Doclesen/Grübeln nicht lösen konnte:

Ich öffne eine MySQL DB "test" (das klappt auch alles soweit gut mit "except" usw.), doch wenn ich

Code: Alles auswählen

def sqlinsert(A, B, C):
        cursor.execute("INSERT INTO `%s` ( `A` , `B` ,`C` ) VALUES (%s, %s, %s)",[TABLE,A, B, C])
mache bekomme ich folgende Fehlermeldung:

"ProgrammingError "(1146, "Table 'test.'202'' doesn't exist")""

(gesetzt sind die Variablen wie folgt: A=1, B=1, C=1, TABLE=202)

:(

Wie muß ich die Tabelle ansprechen, damit das klappt ?

Bin für sachdienliche Hinweise sehr dankbar ;)

Gruß,
Stefan
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Wie genau legst du die Tabelle und die Daten an? Führst du auch immer dann wenn die Daten gespeichert werden sollen ein commit aus? Den der traceback besagt das die tabelle bzw. daten test nicht existiert!
Zuletzt geändert von sape am Mittwoch 29. November 2006, 20:48, insgesamt 1-mal geändert.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Oder anders: Ich gehe mal davon aus das du eine Tabbel anlegst und dan dort Daten einträgst, aber das commit vergist? So, wenn dun dann versuchst darauf zurückzugreifen kann die Tabelle nicht gefunden werden weil sie eben nicht commited wurde.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

stefan3003 hat geschrieben:"ProgrammingError "(1146, "Table 'test.'202'' doesn't exist")""
Hi Stefan!

Willkommen im Python-Forum!

Vielleicht genügt es schon, wenn du die Backticks (`) um das "%s" weg lässt.

Code: Alles auswählen

`%s` --> %s
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

In SQLite sieht ein commit (wenn man autocommit ausgemacht hat, was man immer machen sollte wegen Performance ;)) so aus ->

Code: Alles auswählen

conn = sqlite3.connect(DB_NAME)
cur  = self.conn.cursor()
###hier jetzt daten eintragen
###

# nach dem die daten eingetragen wurden ein commit ausführen damit es in die DB auf der festplatte dauerhaft gespeichert wird.
conn.commit()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben:Vielleicht genügt es schon, wenn du die Backticks (`) um das "%s" weg lässt.
Wenn nicht, dann könntest du dein Problem z.B. so lösen:

Code: Alles auswählen

# Hinweis1: Namen in GROSSBUCHSTABEN sollten Konstanten vorbehalten bleiben!!!
# Hinweis2: Eine Funktion sollte alle Parameter als Argumente übergeben bekommen.
#           Deshalb wäre es gut, wenn ``cursor`` ebenfalls als Argument übergeben
#           wird.

def sqlinsert(cursor, a, b, c):
    # Wenn der Tabellenname aus einer sicheren Quelle kommt, also nicht von einem
    # Benutzer eingegeben werden soll, dann ist es kein Problem, wenn dieser direkt
    # in die SQL-Anweisung eingebunden wird. Die Werte sollten aber weiterhin
    # über das Datenbankinterface und nicht direkt übergeben werden.
    table = "123"
    sql = "INSERT INTO `" + table + "` (`A`, `B`, `C`) VALUES (%s, %s, %s)"
    cursor.execute(sql, (a, b, c))
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
stefan3003
User
Beiträge: 17
Registriert: Montag 27. November 2006, 11:39

gerold hat geschrieben:
gerold hat geschrieben:Vielleicht genügt es schon, wenn du die Backticks (`) um das "%s" weg lässt.
Das brachte keine Änderung ;[

Wenn nicht, dann könntest du dein Problem z.B. so lösen:

Code: Alles auswählen

def sqlinsert(cursor, a, b, c):
    table = "123"
    sql = "INSERT INTO `" + table + "` (`A`, `B`, `C`) VALUES (%s, %s, %s)"
    cursor.execute(sql, (a, b, c))
Das hat das Problem gelöst! Vielen, vielen Dank für die schnelle und präzise Antwort :-)
(Mir ist zwar nicht genau klar warum es so funktioniert, aber ich werde noch ein paar Stunden zum experimentieren damit verbringen) ;)

Gruß,
Stefan
Antworten