MySQLDb und execute-Methode

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

MySQLDb und execute-Methode

Beitragvon JR » Dienstag 19. Dezember 2006, 22:59

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

Beitragvon BlackJack » Dienstag 19. Dezember 2006, 23:53

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

Beitragvon JR » Mittwoch 20. Dezember 2006, 04:05

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 20. Dezember 2006, 11:23

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

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

Beitragvon JR » Mittwoch 20. Dezember 2006, 14:13

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 20. Dezember 2006, 14:34

Mach mal:

Code: Alles auswählen

print tuple('jamil')

:lol:

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

Beitragvon JR » Mittwoch 20. Dezember 2006, 16:28

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder