web-dev-qa-db-fra.com

Comment utiliser count () dans Flask-sqlalchemy

J'assiste un projet qui utilise flask-sqlalchemy.Je veux qu'une requête db compte le nombre d'enregistrements dans la table.Puis-je utiliser table.query.filter_by (condition) .count () directement ou y a-t-il quelque chose dont j'ai besoin ajouter.Veuillez m'aider.Je suis un débutant.Merci à l'avance!

12

Par cette source , ce qui suit devrait fonctionner pour vous:

session.query(Class_name).filter_by(condition).count()

Nom_classe est le nom de la classe mappée pour votre table.

15
Treefish Zhang

Aucune des réponses données n'adresse flask-sqlalchemy spécifiquement, où vous utiliseriez exactement l'exemple que vous avez donné:

Table.query.filter_by(condition).count()

Vous pouvez exécuter .count() sans filtres:

Table.count()

Vous pouvez également compter à l'aide de relations M2M:

ParentTable.children.count()

Et vous pouvez utiliser n'importe lequel de ces éléments directement dans vos modèles jinja comme:

{{ Table.query.filter_by(condition).count() }}

Points bonus (pour la performance):

.count() est un peu lent (surtout avec MySQL, grâce à une mauvaise gestion des sous-requêtes), donc à la place, vous pouvez utiliser un décompte personnalisé qui ressemble à ceci:

db.session.execute(Table.query.filter_by(condition).statement.with_only_columns([func.count()]).order_by(None)).scalar()

Cela suppose que db est votre instance SQLAlchemy (c'est-à-dire db = SQLAlchemy(app)). C'est une bouchée, mais cela vous fera économiser un peu de frais généraux sur les grandes requêtes.

11
Logan Bertram

Oui, c'est ça. Mais rappelez-vous, que 'count ()' fait une requête de plus, comme ceci:

Select count(q.*) from (select * from table) q

Ce n'est pas optimisé. Vous pouvez utiliser ceci:

from sqlalchemy.sql.functions import func
number = session.query(func.count(table.id).label('number').first().number

La requête SQL sera comme ceci:

Select count(table.id) from table
6
antonio_antuan

La simplicité est la meilleure:

accounts = db.session.execute('select count(id) as c from user').scalar()
0
Rimu Atkinson