Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SqlAlchemy gibt nicht alle Zeilen zurück, wenn das Tabellenobjekt abgefragt wird, gibt aber alle Zeilen zurück, wenn ich die Tabellenobjektspalte abfrage

Ich bin auf eine ähnliche Situation gestoßen, in der .all() des SQLAlchemy-Abfrageobjekts gibt nicht alle Zeilen in der Tabelle zurück (es fehlen immer einige), sondern .count() Anruf gibt die richtige Zählung an. Nachdem ich mich ein wenig genauer damit befasst hatte, stellte ich fest, dass die Modelldeklaration vom tatsächlichen Tabellenschema in dieser Datenbank abwich. Erstens hat die Datenbank eine einzelne Primärschlüsselspalte im Schema, aber die Modelldeklaration hat einen Kompositionsprimärschlüssel (im umgekehrten Fall wie bei Ihnen). Außerdem habe ich eine 3-Spalten-Eindeutigkeitsbeschränkung vermisst, wo das Tabellenschema dies hat.

Was dort in meinem Fall passiert ist, war, dass jedes Mal, wenn SQL Alchemy die Datenbank abfragt, alle Zeilen hinter den Kulissen abgerufen wurden, aber aufgrund der falschen Zusammensetzung des Primärschlüssels in meiner Modelldeklaration einige Zeilen daran gehindert wurden, in die Sitzung von SQLAlchemy geladen zu werden (Primärschlüssel identifizieren sich per Definition eindeutig die Objekte und es werden als Ergebnis nicht zwei Objekte mit demselben Primärschlüssel in der Sitzung geladen, daher werden die Kompositionsspalten mit denselben Werten verworfen, selbst in der Datenbank haben sie unterschiedliche PKs.)

Zusammenfassend ist die doppelte Überprüfung der Modelldeklaration mit dem Datenbankschema, um sicherzustellen, dass sie synchron sind, die erste Antwort auf diese Art von Problemen.