ترتيب SQLAlchemy من خلال الاعتماد على علاقة كثير إلى كثير
-
12-11-2019 - |
سؤال
وهذا مثال مبسط لنماذجي الحالية (أنا أستخدم ملحق قارورة SQLAlchemy):
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'
)
أحاول أن أطلب Post
بمقدار الإعجابات لديها.
هذا هو الاستعلام الذي أحاول إصداره بشكل أساسي:
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
لم أتمكن من الحصول على أي شيء يعمل على جانب SQLAlchemy من الأشياء.
شكرا على اي مساعدة أي شخص يمكن أن تقدم.
المحلول
لم أستخدم SQLAlchemy كثيرًا لذا فكرت في تجربة ذلك.لم أحاول استخدام نماذجك، لقد كتبت فقط بعض النماذج الجديدة (على الرغم من أنها مشابهة بما فيه الكفاية):
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
تريد الانضمام إلى likes
الجدول، استخدام func.count
لحساب الإعجابات، group_by
Post
ثم استخدم order_by
:
db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')
لقد وجدت البرنامج التعليمي ORM وبقية وثائق SQLAlchemy مفيدة جدًا.
لا تنتمي إلى StackOverflow