Me encontré con una situación similar en la que .all()
del objeto de consulta de SQLAlchemy no devuelve todas las filas de la tabla (siempre faltan algunas) pero .count()
la llamada da la cuenta correcta. Después de profundizar un poco más, me di cuenta de que la declaración del modelo se desviaba del esquema de tabla real en esa base de datos. Primero, la base de datos tiene una sola columna de clave principal en el esquema, pero la declaración del modelo tiene una clave principal de composición (en caso contrario, como el suyo), también me perdí una restricción única de 3 columnas donde la tiene el esquema de la tabla.
Lo que sucedió allí en mi caso fue que cada vez que SQL Alchemy consultaba la base de datos, obtenía todas las filas detrás de la escena, pero debido a la clave principal de composición incorrecta en la declaración de mi modelo, ha impedido que algunas filas se carguen en la sesión de SQLAlchemy (las claves principales, por definición, identifican de forma única los objetos y, como resultado, no cargará dos objetos con la misma clave principal en la sesión, por lo tanto, desecha las columnas de composición que tienen los mismos valores, incluso en la base de datos, tienen PK diferentes).
En conclusión, verificar dos veces la declaración del modelo con el esquema de la base de datos para asegurarse de que estén sincronizados es la primera respuesta a este tipo de problemas.