Eu me deparei com uma situação semelhante onde o objeto de consulta SQLAlchemy
.all()
não retorna todas as linhas da tabela (sempre faltando algumas), mas .count()
call dá a contagem correta. Depois de investigar um pouco mais, percebi que a declaração do modelo se desviava do esquema de tabela real nesse banco de dados. Primeiro, o banco de dados tem uma única coluna de chave primária no esquema, mas a declaração do modelo tem uma chave primária de composição (no caso reverso como o seu), também perdi uma restrição exclusiva de 3 colunas, onde o esquema da tabela a possui. O que aconteceu lá no meu caso foi que sempre que o SQL Alchemy consulta o banco de dados ele obtém todas as linhas por trás da cena, mas devido à composição incorreta da chave primária na declaração do meu modelo impediu que algumas linhas fossem carregadas na sessão do SQLAlchemy (as chaves primárias por definição identificam exclusivamente os objetos e não carregará dois objetos com a mesma chave primária na sessão como resultado, portanto, descarta as colunas de composição que têm os mesmos valores, mesmo no banco de dados, elas têm PKs diferentes.)
Em conclusão, verifique novamente a declaração do modelo com o esquema do banco de dados para garantir que eles estejam sincronizados é a primeira resposta desse tipo de problema.