MySQLDb und execute-Methode

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
BlackJack

In der ersten Variante sind die Anführungszeichen um das %s zuviel.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mach mal:

Code: Alles auswählen

print tuple('jamil')
:lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Ui, okay ein String ist eine Sequenz, klar :oops:
Antworten