Forum: PC-Programmierung Python Ergebnise von MySQL zeilenweise aufteilen


von David (Gast)


Lesenswert?

Hallo,

mein Vorhaben, ich hole mir aus der MySQL Datenbank je nach Filter in 
der Query einige User ID´s und möchte das Ergebnis dieser Query nun 
Zeilenweise trennen um  später damit weiter zu arbeiten.
1
import pymysql
2
db = pymysql.connect('meine Zugangsdaten bleiben Geheim')
3
4
5
ID_Check = db.cursor()
6
ID_Check.execute("select u.id FROM users u Limit 10")
7
8
result = ID_Check.fetchall()
9
print(result)
10
# Das Ergebnis der Abfrage wird mir so ausgegeben
11
#((1,), (2,), (3,), (4,), (8,), (9,), (10,), (11,), (105,), (106,))
12
13
db.close()
14
15
16
result_names = []
17
for uid in result:
18
    if ',' in uid:
19
        for result in uid.split(','):
20
            result_names.append(result)
21
    else:
22
        result_names.append(uid)
23
print(uid[0])

In diesem Beispiel wird mir nur das letzte Ergebnis angezeigt. Wie kann 
ich das aber trennen, dass mir jede User ID in einer eigenen Zeile 
ausgeben wird?

von imonbln (Gast)


Lesenswert?

David schrieb:
> # Das Ergebnis der Abfrage wird mir so ausgegeben
> #((1,), (2,), (3,), (4,), (8,), (9,), (10,), (11,), (105,), (106,))

das ist ein tuple von tuples. versuch mal sowas
1
result_names = [x[0] for x in result]

wenn nach den (1,) noch der Username steht also  (1, name) dann x[1].

von M.K. B. (mkbit)


Lesenswert?

David schrieb:
1
> result_names = []
2
> for uid in result:
3
>     if ',' in uid:
4
>         for result in uid.split(','):
5
>             result_names.append(result)
6
>     else:
7
>         result_names.append(uid)

Man sollte sich hier immer fragen, warum man die Daten wieder manuell 
trennen muss. In der Datenbank sind sie ja schon nach Zeilen und Spalten 
getrennt, also würde ich auch erwarten, dass die Abfrage das so 
übernimmt. Tut sie auch!
Was würde außerdem passieren, wenn eines der Werte im result ein ',' 
enthält?

Was dich hier vermutlich fehlgeleitet hat ist die _str_ methode des 
result objects. imonbln hat recht, dass es ein tuple von tuples ist. 
Wenn du ein tuple aber mit print ausgibst, dann wird die _str_ methode 
des tuples aufgerufen und diese formatiert es dir schön zur besseren 
Lesbarkeit mit Kommas und Klammern.

von David (Gast)


Lesenswert?

Hallo und Danke für eure Antworten.


ich habe das jetzt so umgesetzt. Ist das eine gängige Form das so zu 
machen? Oder ist das der falsche Weg?

Und nein, es werden keine Usernamen ausgelesen. Ausschließlisch di ID´s

1
import pymysql
2
db = pymysql.connect('meine Zugangsdaten bleiben Geheim')
3
4
5
ID_Check = db.cursor()
6
ID_Check.execute("select u.id FROM users u Limit 10")
7
8
result = ID_Check.fetchall()
9
print(result)
10
# Das Ergebnis der Abfrage wird mir so ausgegeben
11
#((1,), (2,), (3,), (4,), (8,), (9,), (10,), (11,), (105,), (106,))
12
13
db.close()
14
15
16
for row in result:
17
    uid= row[0]
18
    print(uid)

von Sheeva P. (sheevaplug)


Lesenswert?

David schrieb:
> ich habe das jetzt so umgesetzt.

Viel wichtiger als die Umsetzung wäre allerdings ein Verständnis. ;-)

> Ist das eine gängige Form das so zu
> machen? Oder ist das der falsche Weg?

Das ist der Weg, den PEP 249 "Python Database API Specification v2.0" 
vorsieht und insofern sowohl a) eine der gängigsten Formen als auch b) 
Der Richtige Weg (tm). Eine Alternative wäre, einen DictCursor zu 
verwenden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.