SQLAlchemy-Reihenfolge nach Anzahl auf einer Viele-zu-Viele-Beziehung
-
12-11-2019 - |
Frage
Dies ist ein vereinfachtes Beispiel meiner aktuellen Modelle (Ich verwende die Flask SQLAlchemy-Erweiterung):
like = db.Table(
'like',
db.Column('uid', db.Integer, db.ForeignKey('users.id')),
db.Column('pid', db.Integer, db.ForeignKey('posts.id'))
)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(20))
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(255))
likes = db.relationship(
'User',
secondary = like,
backref = db.backref('likes', lazy = 'dynamic'),
lazy = 'dynamic'
)
Ich versuche zu bestellen Post
ist um die Menge Likes es hat.
Dies ist die Abfrage, die ich grundsätzlich stellen möchte:
SELECT p.*, COUNT(l.`pid`) as `likes`
FROM `posts` as p
LEFT JOIN `like` as l
ON p.`id` = l.`pid`
GROUP BY p.`id`
ORDER BY `likes` DESC
Ich konnte einfach nichts auf der SQLAlchemy-Seite zum Laufen bringen.
Vielen Dank für jede Hilfe, die jemand anbieten kann.
Lösung
Ich habe SQLAlchemy nicht oft verwendet, also dachte ich, ich versuche es mal.Ich habe nicht versucht, Ihre Modelle zu verwenden, sondern nur ein paar neue geschrieben (allerdings ähnlich genug):
likes = db.Table('likes',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('post_id', db.Integer, db.ForeignKey('post.id'))
)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20))
def __repr__(self):
return "<User('%s')>" % self.username
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255))
likes = db.relationship('User', secondary = likes,
backref = db.backref('posts', lazy='dynamic'))
def __repr__(self):
return "<Post('%s')>" % self.title
Sie möchten dem beitreten likes
Tisch, Verwendung func.count
Likes zählen, group_by
Post
und dann verwenden order_by
:
db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')
ich fand die ORM-Tutorial und der Rest der SQLAlchemy-Dokumentation ist sehr nützlich.