Abfragen auf MySQL aus Python, die identische Daten liefern
Das wiederholte Abfragen einer MySQL-Datenbank aus Python zum Abrufen dynamischer Daten stellt eine Herausforderung dar. Es ist bekannt, dass das bloße Durchlaufen einer Abfrage in einer Schleife nicht ausreicht, um neue Daten aus der Datenbank abzurufen.
Ihr bereitgestellter Code veranschaulicht dieses Problem:
for i in range(listSize):
#...
mycursor = mydb.cursor(dictionary=True)
mycursor.execute(sql)
#...
Selbst bei Versuchen mit fetchall, fetchmany und fetchone stagnieren die Ergebnisse.
Die Lösung: Festschreiben der Verbindung
Um dieses Problem zu beheben, muss auf jede Abfrageausführung ein Commit der Verbindung folgen. Diese Aktion schließt die laufende Transaktion ab und initiiert eine neue, sodass die nachfolgende Abfrage Änderungen erkennen kann, die während der vorherigen Transaktion vorgenommen wurden.
while True:
#...
mycursor = mydb.cursor(dictionary=True)
mycursor.execute(sql)
#...
mydb.commit()
#...
Isolationsstufen und der REPEATABLE READ-Standard
Dieses Konzept basiert auf Isolationsstufen. Standardmäßig verwendet MySQL REPEATABLE READ für InnoDB. Dies bedeutet, dass innerhalb einer Transaktion bei nachfolgenden Lesevorgängen der Snapshot beibehalten wird, der durch den ersten Lesevorgang der Transaktion erstellt wurde. Ohne Commit werden daher bei nachfolgenden Abfragen keine Änderungen erfasst.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3