PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Psycopg2 rowcount pour le curseur côté serveur

Dans le cas d'un curseur côté serveur, bien que cursor.execute() renvoie, la requête n'a pas nécessairement été exécutée par le serveur à ce moment-là, et donc le nombre de lignes n'est pas disponible pour psycopg2 . Ceci est cohérent avec la spec DBAPI 2.0 qui indique que rowcount doit être -1 si le nombre de lignes de la dernière opération est indéterminé.

Tente de le contraindre avec cursor.fetchone() , par exemple, met à jour cursor.rowcount , mais uniquement par le nombre d'éléments récupérés, ce qui n'est donc pas utile. cursor.fetchall() se traduira par rowcount étant correctement défini, cependant, qui effectue la requête complète et le transfert de données que vous cherchez à éviter.

Une solution de contournement possible qui évite une requête complètement distincte pour obtenir le nombre et qui devrait donner des résultats précis est la suivante :

select *, (select count(*) from test) from test;

Ainsi, chaque ligne aura le nombre de lignes du tableau ajouté en tant que colonne finale. Vous pouvez ensuite obtenir le nombre de lignes du tableau en utilisant cursor.fetchone() puis en prenant la dernière colonne :

with db.cursor('cursor_name') as cursor:
    cursor.execute('select *, (select count(*) from test) from test')
    row = cursor.fetchone()
    data, count = row[:-1], row[-1]

Maintenant, count contiendra le nombre de lignes du tableau. Vous pouvez utiliser row[:-1] pour faire référence aux données de ligne.

Cela peut ralentir la requête car un SELECT COUNT(*) éventuellement coûteux sera effectué, mais une fois terminé, la récupération des données devrait être rapide.