Seite 1 von 1

MySQLdb/Verständnisproblem

Verfasst: Mittwoch 29. November 2006, 20:33
von stefan3003
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

Verfasst: Mittwoch 29. November 2006, 20:46
von sape
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!

Verfasst: Mittwoch 29. November 2006, 20:47
von sape
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.

Re: MySQLdb/Verständnisproblem

Verfasst: Mittwoch 29. November 2006, 20:51
von gerold
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
:-)

Verfasst: Mittwoch 29. November 2006, 20:51
von sape
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()

Re: MySQLdb/Verständnisproblem

Verfasst: Mittwoch 29. November 2006, 20:59
von gerold
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
:-)

Re: MySQLdb/Verständnisproblem

Verfasst: Mittwoch 29. November 2006, 21:21
von stefan3003
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