Insert erst beim zweiten Anlauf erfolgreich
Verfasst: Dienstag 31. Januar 2017, 21:29
Hallo Leute,
ich habe da mal wieder eine Frage. Dieses mal indirekt zu Python sondern eher zu der MySQL-Anbindung.
Ich habe in meinem Testprojekt (nun mein zweites, quasi 'Fortgeschrittenes Projekt') Fußballdaten die ich in meine MySQL-DB einfügen möchte.
Ich habe eine XML mit einer kompletten Saison an Daten.
So, jetzt parse ich diese XML und sammle alle relevanten Daten in meine Klasse.
Dazu u.a. Saison, Liga, Datum, Runde, Paarung mit Teams, Ergebnis usw..
So weit so gut.
Ich befülle also meine Membervariablen die in verschiedene Bereiche gegliedert sind.
Ligaübergreifende, dann Rundendaten, dann Matchdaten.
Es gibt in der Bundesliga ja 34 Spieltage, also Runden. Ich schleife also bis zum Ende 34 Mal durch. Nach jedem Schleifendurchgang werden die betreffende Membervariablen resettet und neu befüllt mit den Daten der nächsten Runde. In jeder Runde gibt es 9 Spielpaarungen die auch wiederrum durchgeschleift werden. Da resette ich eben nur diesen Bereich nach jedem Schleifendurchgang und befülle die mit relevanten Daten.
Sprich: nach jedem Match befülle ich die DB mit den Daten bevor ich die entsprechenden Daten resete und zum nächsten Match schleife.
Dabei werden auch die immer wiederkehrende bzw. gleiche Daten in den Tabellen für die Teams, Liga, Saison, Stadion, usw. befüllt.
Dabei verwende ich ein Insert-Statement welcher sicherstellt das es die Daten nicht gibt bevor sie befüllt werden und falls doch, dann gibt es keine Daten zum befüllen. (Insert into... (Select id from tabelle where foreign_id = 12345 limit 1). Es gibt also keine Fehlermeldung der DB selber das ein Key bereits vorhanden ist oder der Gleichen...
Passt auch alles ganz gut.
Jetzt habe ich aber ein Phänomen:
Beim ersten Durchgang fehlen mir die kompletten Daten der ersten Runde. Alle darauffolgenden Runden sind aber vorhanden.
Lasse ich das Programm gleich nochmals laufen, so sind dann auch die Daten der 1. Runde vorhanden.
Das SQL-Statement habe ich mir auch ausgeben lassen (print cursor.last_executed) und kopiere das Statement und führe es manuell in der DB aus nach dem ersten Druchgang (um sicherzustellen das andere relevante Daten vorhanden sind da diese ja vor den Spielpaarungsdaten befüllt werden falls nicht schon vorhanden).
Da ist kein Synthax-Fehler oder der Gleichen und er führt es ja auch wie gewünscht aus in der MySQL-Workbench.
Auch die Daten des Insert-Statements, die aus andere Tabellen stammen, die eventuell noch nicht vorhanden sein könnten weil sie vor der ersten Runde doch befüllt werden (und eventuell aus Zeitgründen noch nicht verfügbar wären) sind aber ganz normal vorhanden in dem ausgegeben Statement (cursor._last_executed).
Somit kann es auch kein 'Zeitproblem' der DB sein.
Was kann ich tun um dem Fehler auf den Grund zu gehen?
Synthaktisch ist alles ok. Dateninhaltstechnisch auch. Es muss an der DB oder der Verbindung selber liegen.
Es passiert ja nur beim ersten Durchgang wenn auch alle anderen Tabellen VORHER im Programm erstmalig befüllt werden.
Gibt es ein Befehl bei dem ich eventuell die connection resetten kann ohne sie zu schliessen und neu aufzubauen?
Oder meint ihr es liegt an was Anderem?
ich habe da mal wieder eine Frage. Dieses mal indirekt zu Python sondern eher zu der MySQL-Anbindung.
Ich habe in meinem Testprojekt (nun mein zweites, quasi 'Fortgeschrittenes Projekt') Fußballdaten die ich in meine MySQL-DB einfügen möchte.
Ich habe eine XML mit einer kompletten Saison an Daten.
So, jetzt parse ich diese XML und sammle alle relevanten Daten in meine Klasse.
Dazu u.a. Saison, Liga, Datum, Runde, Paarung mit Teams, Ergebnis usw..
So weit so gut.
Ich befülle also meine Membervariablen die in verschiedene Bereiche gegliedert sind.
Ligaübergreifende, dann Rundendaten, dann Matchdaten.
Es gibt in der Bundesliga ja 34 Spieltage, also Runden. Ich schleife also bis zum Ende 34 Mal durch. Nach jedem Schleifendurchgang werden die betreffende Membervariablen resettet und neu befüllt mit den Daten der nächsten Runde. In jeder Runde gibt es 9 Spielpaarungen die auch wiederrum durchgeschleift werden. Da resette ich eben nur diesen Bereich nach jedem Schleifendurchgang und befülle die mit relevanten Daten.
Sprich: nach jedem Match befülle ich die DB mit den Daten bevor ich die entsprechenden Daten resete und zum nächsten Match schleife.
Dabei werden auch die immer wiederkehrende bzw. gleiche Daten in den Tabellen für die Teams, Liga, Saison, Stadion, usw. befüllt.
Dabei verwende ich ein Insert-Statement welcher sicherstellt das es die Daten nicht gibt bevor sie befüllt werden und falls doch, dann gibt es keine Daten zum befüllen. (Insert into... (Select id from tabelle where foreign_id = 12345 limit 1). Es gibt also keine Fehlermeldung der DB selber das ein Key bereits vorhanden ist oder der Gleichen...
Passt auch alles ganz gut.
Jetzt habe ich aber ein Phänomen:
Beim ersten Durchgang fehlen mir die kompletten Daten der ersten Runde. Alle darauffolgenden Runden sind aber vorhanden.
Lasse ich das Programm gleich nochmals laufen, so sind dann auch die Daten der 1. Runde vorhanden.
Das SQL-Statement habe ich mir auch ausgeben lassen (print cursor.last_executed) und kopiere das Statement und führe es manuell in der DB aus nach dem ersten Druchgang (um sicherzustellen das andere relevante Daten vorhanden sind da diese ja vor den Spielpaarungsdaten befüllt werden falls nicht schon vorhanden).
Da ist kein Synthax-Fehler oder der Gleichen und er führt es ja auch wie gewünscht aus in der MySQL-Workbench.
Auch die Daten des Insert-Statements, die aus andere Tabellen stammen, die eventuell noch nicht vorhanden sein könnten weil sie vor der ersten Runde doch befüllt werden (und eventuell aus Zeitgründen noch nicht verfügbar wären) sind aber ganz normal vorhanden in dem ausgegeben Statement (cursor._last_executed).
Somit kann es auch kein 'Zeitproblem' der DB sein.
Was kann ich tun um dem Fehler auf den Grund zu gehen?
Synthaktisch ist alles ok. Dateninhaltstechnisch auch. Es muss an der DB oder der Verbindung selber liegen.
Es passiert ja nur beim ersten Durchgang wenn auch alle anderen Tabellen VORHER im Programm erstmalig befüllt werden.
Gibt es ein Befehl bei dem ich eventuell die connection resetten kann ohne sie zu schliessen und neu aufzubauen?
Oder meint ihr es liegt an was Anderem?