MySQLdb: executemany liefert Probleme

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Donnerstag 3. März 2011, 17:48

Hallo,

ich möchte gerne mehrere SELECT Abfragen mittels der MySQLdb-Funktion CURSOR.EXECUTEMANY an die MySQL Datenbank schicken. Dabei passiert immer folgendes:

Code: Alles auswählen

>>>mehrere_ids = map(lambda l: [l,], range(50))
>>>count = cursor.executemany("SELECT * FROM tabelle WHERE id=%s", mehrere_ids)
>>>print count #dabei wird mir die anzahl von einträgen angezeigt welche ich auch eigentlich erhalten soll
(z.B.) 200
>>># wenn ich nun aber die %count% Ergebnisse mir holen will passiert folgendes
>>>rows = cursor.fetchall()
>>>print len(rows) # dabei wird mir immer nur EINE zeile anstatt %count% Zeilen zurückgeworfen
1
Nun verstehe ich aber nicht warum ich nur eine Zeile bekomme wenn ich doch eigentlich z.B. 200 Zeilen bekommen sollte...
Wie kann ich dieses Problem lösen?

Lg
microkernel
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Donnerstag 3. März 2011, 18:52

Ok ich habe die Antwort bereits selber gefunden. Anstatt EXECUTEMANY nutze ich einfach eine andere Variante:

Code: Alles auswählen

>>>mehrere_ids = tuple(map(lambda l: [l,], range(50)))
>>>count = cursor.execute("SELECT * FROM tabelle WHERE id IN %s"%format(mehrere_ids))
>>>print count
(z.B.) 200
>>>rows = cursor.fetchall()
>>>len(rows)
200
Benutzeravatar
sparrow
User
Beiträge: 2745
Registriert: Freitag 17. April 2009, 10:28

Donnerstag 3. März 2011, 23:45

Hallo Microkernel,

denkst du daran, dass bei diesem Code eine SQL-Inkektion möglich ist?

Ich würde mir das gleich Abgewöhnen.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Samstag 5. März 2011, 15:55

Ja klar ist mir das bewusst. Aber es gibt bei meinen Programm keine Schnittstelle wo der User in nur geringster Weise einen Einfluss auf die Liste hat. Demnach kann er doch auch keine Angriffe ausüben, oder etwa doch?
Benutzeravatar
noisefloor
User
Beiträge: 3198
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Samstag 5. März 2011, 22:04

Hallo,

nein, dann nicht. Nichts desto trotz sollte man sich sowas erst gar nicht angewöhnen, weil es halt immer eine _potentielle_ Sicherheitslücke ist.

Gruß, noisefloor
Antworten