MySQL-Python-DB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Donnerstag 22. November 2007, 10:35

Hello liebe Leute,

ich hab das im Forum gefunden und wollts mal ausprobrieren. Kann mir jemand sagen, woran der Fehler liegt... ich verwende dazu ;MySQL und Pyton 2.5.1

LG

Code: Alles auswählen

    def OnCreate(self):
        
        sql = '''CREATE TABLE adressesTemp ( 
        id INTEGER PRIMARY KEY NOT NULL, 
        vorname VARCHAR(30), 
        zuname VARCHAR(40), 
        nachname VARCHAR(30), 
        anrede VARCHAR(20), 
        adresse VARCHAR(50), 
        plz VARCHAR(15), 
        ort VARCHAR(25), 
        land VARCHAR(30), 
        privatnummer VARCHAR(35), 
        privatfaxnummer VARCHAR(35), 
        mobilnummer VARCHAR(35), 
        bueronummer VARCHAR(35), 
        buerofaxnummer VARCHAR(35) 
    )''' 
            
        Cursor.execute(sql) 
        conn.commit ()

    def OnInsert(self,
                    vorname = None, zuname = None, nachname = None, anrede = None, adresse = None, plz = None, ort = None, land = None, 
                    privatnummer = None, privatfaxnummer = None, mobilnummer = None, bueronummer = None, buerofaxnummer = None 
                    ):
                    
        
        INSERT = '''INSERT INTO adressesTemp ( 
                vorname, 
                zuname, 
                nachname, 
                anrede, 
                adresse, 
                plz, 
                ort, 
                land, 
                privatnummer, 
                privatfaxnummer, 
                mobilnummer, 
                bueronummer, 
                buerofaxnummer 
            ) VALUES ( 
                :vorname, 
                :zuname, 
                :nachname, 
                :anrede, 
                :adresse, 
                :plz, 
                :ort, 
                :land, 
                :privatnummer, 
                :privatfaxnummer, 
                :mobilnummer, 
                :bueronummer, 
                :buerofaxnummer)''' 
         

        Cursor.execute(INSERT,{'vorname':vorname, 'zuname':zuname, 'nachname':nachname, 'anrede':anrede, 'adresse':adresse, 'plz':plz, 
                              'ort':ort, 'land':land, 'privatnummer':privatnummer, 'privatfaxnummer':privatfaxnummer, 
                              'mobilnummer':mobilnummer, 'bueronummer':bueronummer, 'buerofaxnummer':buerofaxnummer} 
                         ) 
                        
        Cursor.execute(sql) 
        conn.commit ()

Code: Alles auswählen

raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':vorname, \n :zuname, \n :nachname, \n ' at line 16")
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 22. November 2007, 10:55

MySQLdb verwendet keine ':platzhalter' und erwartet als Werte-Parameter für `.execute()` ein Dictionary, sondern behandelt '?' als Platzhalter und die Werte müssen als Sequenz (Tupel, Liste, ...) übergeben werden.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Donnerstag 22. November 2007, 11:05

danke für die Antwort!
also wär doch das richtig gewesen?

Code: Alles auswählen

        INSERT= '''INSERT INTO adressesTemp ( 
                vorname, 
                zuname, 
                nachname, 
                anrede, 
                adresse, 
                plz, 
                ort, 
                land, 
                privatnummer, 
                privatfaxnummer, 
                mobilnummer, 
                bueronummer, 
                buerofaxnummer 
            ) VALUES ( 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s, 
                %s)''' % (vorname, zuname, nachname, anrede, adresse, plz, ort, land, 
privatnummer, privatfaxnummer, mobilnummer, bueronummer, buerofaxnummer)
BlackJack

Donnerstag 22. November 2007, 11:31

Ja und Nein. Das kann funktionieren, muss es aber nicht. Siehe [wiki]Parametrisierte SQL-Queries[/wiki]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 22. November 2007, 13:54

BlackJack hat geschrieben:Das kann funktionieren, muss es aber nicht.
Genau. Wenn man SQL-Injections unter "funktionieren" einstuft, dann funktioniert es sogar Klasse.
Also: SQL immer nur vom DB-Modul konstruieren lassen, selber-quoten ist in der Regel nicht sonderlich schlau.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 22. November 2007, 14:42

Ups, ich meine natürlich auch '%s' (wie du offenbar richtig herausgefunden hast) und nicht '?' - da hab ich was mit einem anderen Wrapper verwechselt.

Der von BlackJack und Leonidas angesprochene feine, aber doch gravierende Unterschied liegt darin, dass bei der %-Formatierung über diesen Operator die Platzhalter zwar ersetzt werden, bei diesen aber nicht wie bei der zweiten Variante, die die Werte separat als Argument für `.execute()` erwartet, eine Maskierung von (potentiell gefährlichen) Zeichen vorgenommen wird.

Dies ist leider ein Schwachpunkt von '%s' als Platzhaltern, da er diesen Missbrauch ermöglicht und die wichtigen Grenzen der beiden (technischen) Möglichkeiten verwischt.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Donnerstag 22. November 2007, 16:17

danke Leute!
ich habs grad so ausprobiert und es scheint zumindest zu funktionieren..

Code: Alles auswählen


        Cursor.execute( '''
                        INSERT INTO adressesTemp
                        (
                        id,
                        vorname, 
                        zuname, 
                        nachname, 
                        anrede, 
                        adresse, 
                        plz, 
                        ort, 
                        land, 
                        privatnummer, 
                        privatfaxnummer, 
                        mobilnummer, 
                        bueronummer, 
                        buerofaxnummer 
                        ) VALUES (
                        %(id)s, 
                        %(vorname)s, 
                        %(zuname)s, 
                        %(nachname)s, 
                        %(anrede)s, 
                        %(adresse)s, 
                        %(plz)s, 
                        %(ort)s, 
                        %(land)s, 
                        %(privatnummer)s, 
                        %(privatfaxnummer)s, 
                        %(mobilnummer)s, 
                        %(bueronummer)s,
                        %(buerofaxnummer)s
                        )
                        ''' ,{
                        'id':'555',
                        'vorname':'wir',
                        'zuname':'fahren',
                        'nachname':'zu',
                        'anrede':'der',
                        'adresse':'EM',
                        'plz':'2008',
                        'ort':'OHNE',
                        'land':'england',
                        'privatnummer':'0049111111',
                        'privatfaxnummer':'0049111111',
                        'mobilnummer':'0049111111',
                        'bueronummer':'0049111111',
                        'buerofaxnummer':'0049111111'})
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 22. November 2007, 16:32

Y0Gi hat geschrieben:Dies ist leider ein Schwachpunkt von '%s' als Platzhaltern, da er diesen Missbrauch ermöglicht und die wichtigen Grenzen der beiden (technischen) Möglichkeiten verwischt.
Don't worry. Sieht in Python 3 etwas anders aus.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 22. November 2007, 16:49

Worauf beziehst du dich speziell?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 22. November 2007, 17:42

Y0Gi hat geschrieben:Worauf beziehst du dich speziell?
Sorry, mein Fehler. Dieses Formatting sieht immer noch genauso aus. Hatte wohl was anderes im Kopf.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Freitag 23. November 2007, 15:03

hi,

brauche ich bei MySQL auch so eine "try-except", wenn sowieso bei Eingabe falscher Daten einen Fehler gemeldet wird?

wenn ja was kommt denn nach "except" :oops:

LG,
fanus

Code: Alles auswählen

         try: 
             self.cur.execute(sql, locals()) 
             self.conn.commit() 
             return (True, "") 
         except sqlite3.IntegrityError, data: 
             return (False, data) 
BlackJack

Freitag 23. November 2007, 15:49

Um Himmels willen was machst Du denn da. Das ``try``/``except`` gehört um den Code-Teil bei dem man im ``except``-Teil auch etwas sinnvolles in der Ausnahmesituation machen kann. Eine Ausnahme in einen Fehlerstatus umzuwandeln ist nicht sinnvoll, diesen Blödsinn sollen Ausnahmen ja gerade vermeiden.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Freitag 23. November 2007, 17:00

das wurde 1 zu 1 aus diesem bsp genommen und wollte nur wissen wie ich das auf meine MySQL-DB anwenden kann. :roll:

http://gelb.bcom.at/trac/misc/browser/s ... rev=11#L99
BlackJack

Freitag 23. November 2007, 17:19

Na gut: Was um Himmels willen macht gerold denn da…
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 23. November 2007, 18:21

BlackJack hat geschrieben:Na gut: Was um Himmels willen macht gerold denn da…
Hallo!

Sch... :roll:
Created: 2006-07-10
Ich wusste nicht dass das noch irgendwo verlinkt ist. Bitte nehmt das nicht als Beispiel her. Das war irgendwie eine nicht durchdachte Mitternachtsaktion, an der ich im Laufe von ein paar Tagen irgendetwas geändert habe, die ich aber nie fertig machte. Ich habe mich dabei (glaube ich noch zu wissen) in einer unschönen Codestruktur verrannt.

Das sollte ich eigentlich komplett löschen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten