Jeg løb ind i en lignende situation, hvor SQLAlchemy-forespørgselsobjektets .all()
returnerer ikke alle rækkerne i tabellen (mangler altid nogle), men .count()
opkald giver det korrekte tal. Efter at have gravet lidt mere i det, indså jeg, at modelerklæringen afveg fra det faktiske tabelskema i den database. For det første har databasen en enkelt primærnøglekolonne i skemaet, men modelerklæringen har en sammensætningsprimærnøgle (i omvendt tilfælde som din), også savnede jeg en unik begrænsning med 3 kolonner, hvor som tabelskemaet har det.
Hvad der skete der i mit tilfælde var, at hver gang SQL Alchemy forespurgte databasen, fik den alle rækkerne bag scenen, men på grund af den forkerte sammensætning har den primære nøgle i min modelerklæring forhindret, at nogle rækker indlæses i SQLAlchemys session (primære nøgler pr. definition identificerer unikt objekterne, og det vil ikke indlæse to objekter med den samme primære nøgle i session som et resultat, derfor smider den de sammensætningskolonner ud, der har samme værdier, selv i databasen, de har forskellige PK'er.)
Som konklusion, dobbelttjek modelerklæring med databaseskema for at sikre, at de er synkroniseret, er det første svar fra denne slags problemer.