ich fange frisch mit Python an, komme eigentlich aus der PhP - Ecke, weiß also was Variablen und Datentypen sind.
System ist 3.4.4 , 64 bit mit entsprechendem MySQL-Connector. Technisch funktioniert auch alles. Aber:
Den Unterschied zwischen fetchall() und fetchone() habe ich verstanden, aber in der Praxis verwundert mich das Ergebnis, bei dem ich trotz Manuals und Lernvideos einfach nicht weiterkomme.
Ich habe eine MySQLDatenbank mit einer Tabelle mit 18 Einträgen (zum Testen), deren Einträge eine fortlaufende ID von 1-18 haben.
Jetzt kommt mein Problem.
Code: Alles auswählen
import mysql.connector
conn=mysql.connector.connect(user='user', password='password', host='192.168.130.20', database='datenbank')
mycursor=conn.cursor()
mycursor.execute("SELECT * FROM tabelle")
ergebnis=mycursor.fetchone()
for ergebnis in mycursor:
print("ID: ", ergebnis[0])
print("Hersteller: ", ergebnis[2])
print("Modell: ", ergebnis[1])
print("-------")
Das Ergebnis sind alle 18 Datensätze, jedoch komplett durcheinander, obwohl in der Tabelle ordentlich nach ID sortiert.
Die "gleiche" Abfrage in PhP ergibt eine Ausgabe von Datensatz1 bis Datensatz 18.
Wenn Python also von oben nach unten ausliest, müsste schon jetzt 1-18 sortiert ausgeben werden, tut es aber nicht?!
OK, also extra sortiert ausgeben:
Code: Alles auswählen
mycursor.execute("SELECT * FROM tabelle ORDER BY ID")
ergebnis=mycursor.fetchone()
for ergebnis in mycursor:
print("ID: ", ergebnis[0])
print("Hersteller: ", ergebnis[2])
print("Modell: ", ergebnis[1])
print("-------")
Datensatz 2
Datensatz 3
Datensatz 4
....
Datensatz 18
Wo ist Datensatz 1?
Teste ich mal andersrum:
Code: Alles auswählen
mycursor.execute("SELECT * FROM tabelle WHERE ID <= 3 ORDER BY ID")
ergebnis=mycursor.fetchone()
for ergebnis in mycursor:
print("ID: ", ergebnis[0])
print("Hersteller: ", ergebnis[2])
print("Modell: ", ergebnis[1])
print("-------")
Datensatz 2
Datensatz 3
Auch hier kein Datensatz 1.
Nochmal Gegentest:
Code: Alles auswählen
mycursor.execute("SELECT * FROM actioncam WHERE ID > 10 ORDER BY ID")
ergebnis=mycursor.fetchone()
for ergebnis in mycursor:
print("ID: ", ergebnis[0])
print("Hersteller: ", ergebnis[2])
print("Modell: ", ergebnis[1])
print("-------")
Datensatz 12
Datensatz 13
...
Datensatz 18
Er überspringt also stets den 1. gefundenen Datensatz, in diesem Fall fehlt Datensatz 11.
Das Ergebnis von fetchall() zeigt mir natürlich das komplette Ergebnis (inkl. 1. Datensatz) an, ich brauche aber fetchone() zur Bearbeitung und Anzeige einzelner Datensätze.
Jetzt die Masterfrage(n): wieso zeigt er das Ergebnis nicht in der Reihenfolge an, wie die Datensätze in der Tabelle sequentiell vorkommen (also 1-18) und wieso überspringt er ständigden ersten gefundenen Datensatz? Habe ich irgendwo Pflaumen auf den Augen?
Bitte um Nachsicht, wenn das der Fall ist!