Seite 1 von 1

MySQLDb und execute-Methode

Verfasst: Dienstag 19. Dezember 2006, 22:59
von JR
Hi!

Soeben habe ich etwas ziemlich blödes festgestellt.
Im unten stehenden Code laufen unter WinXP beide Varianten (siehe Konstante VARIANTE).
Unter Linux (Ubuntu) geht nur Variante != 1, welche das Maskieren von Escape-Sequenzen nicht macht :-(

Code: Alles auswählen

#!/Python24/python.exe
# -*- coding: iso-8859-1 -*-
# File: MySQL_scripting.py
import MySQLdb
VARIANTE = 0

def main():
    Con = MySQLdb.Connect(host = '127.0.0.1', 
                    port = 3306, 
                    user = 'FPK', 
                    passwd = 'kmmanager', 
                    db = 'afv')
    
    if Con:
        if VARIANTE == 1:
            statement = 'SELECT mit_id FROM mitglieder WHERE mit_user="%s";'
            parameters = ('jamil')
            result = sqlcmd(Con, statement, parameters)
        else:
            statement = 'SELECT mit_id FROM mitglieder WHERE mit_user="jamil";'
            result = sqlcmd(Con, statement)            
        if result:
            print result[0][0]
#----------------------------------------------------- 
def sqlcmd(Con, cmd='', parameters=[]):
    try:
        Cursor = Con.cursor()
        if parameters:
            Cursor.execute(cmd, tuple(parameters))
        else: 
            Cursor.execute(cmd) 
        result = Cursor.fetchall()
        Con.commit()
        return result
    except:
        return None
#----------------------------------------------------- 
if __name__ == '__main__':
    main()
Weiß jemand, wieso das so ist?

Grüße
Jamil

Verfasst: Dienstag 19. Dezember 2006, 23:53
von BlackJack
In der ersten Variante sind die Anführungszeichen um das %s zuviel.

Verfasst: Mittwoch 20. Dezember 2006, 04:05
von JR
Hi!

Danke für deinen Tipp. Wieso das unter WinXP kein Problem war und nun unter Linux ein Problem ist...

Wird wohl an den Versionen von MySQLDb liegen.

Also dann bis denn
Jamil

Verfasst: Mittwoch 20. Dezember 2006, 11:23
von jens
Zeile 18:

Code: Alles auswählen

parameters = ('jamil')
Das ist kein tupel, weil ein Komma fehlt ;)

Vergleiche:

Code: Alles auswählen

print ('jamil')  # ist nur ein String
print ('jamil',) # Ist ein tupel mit einem Element

Verfasst: Mittwoch 20. Dezember 2006, 14:13
von JR
Hi jens!

Danke für den Hinweis, das ist mir eigentlich bewusst. Ist ein Tippfehler, aber in Zeile 30 findet zur Sicherheit eine Typumwandlung tuple() statt.

Daran lag es nicht. Die Anführungsstriche stören auf einmal, ob wohl es sonst so im Programm funktionierte.

Grüße
Jamil

Verfasst: Mittwoch 20. Dezember 2006, 14:34
von jens
Mach mal:

Code: Alles auswählen

print tuple('jamil')
:lol:

Verfasst: Mittwoch 20. Dezember 2006, 16:28
von JR
Ui, okay ein String ist eine Sequenz, klar :oops: