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!
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.
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.
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
La simplicité est la meilleure:
accounts = db.session.execute('select count(id) as c from user').scalar()