鍍金池/ 問答/Python  數(shù)據(jù)庫/ sqlalchemy怎么通過外鍵排序。

sqlalchemy怎么通過外鍵排序。

這里有兩張一對多的關(guān)系表,User和Comment。

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(32), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)
    comments = db.relationship('Comment', backref='author', lazy='dynamic')

class Comment(db.Model):
    __tablename__ = 'comments'
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)
    star = db.Column(db.Boolean, default=False)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))

User表是用戶, Comment表是用戶的評論, 怎么按用戶的評論數(shù)做降序排列?

回答
編輯回答
萌吟

@藕絲空間 結(jié)果是出來了。

In [128]: sbq = db.session.query(User.email, User.username, func.count(Comment.author_id).label("c_nums
     ...: ")).filter(User.id==Comment.author_id).subquery()

In [129]: data = db.session.query(User.email, User.username, sbq.c.c_nums).order_by(sbq.c.c_nums.desc()
     ...: ).distinct().all()

In [130]: for d in data:
     ...:     print(d.email, d.username, d.c_nums)
     ...:     
(u'raymond@dabshots.org', u'shirley', 100L)
(u'cheryl@quaxo.net', u'rachel', 100L)
(u'debra@yoveo.net', u'carol', 100L)
(u'kathleen@kaymbo.com', u'nancy', 100L)
(u'melissa@youtags.org', u'amy', 100L)
(u'margaret@riffwire.net', u'kimberly', 100L)
...
...

但是沒有排序:

In [131]: for i in User.query.all():
     ...:     print i.email, i.username, i.comments.count()
     ...:     
raymond@dabshots.org shirley 2
margaret@riffwire.net kimberly 6
brenda@realbuzz.com ashley 1
lillian@devpulse.name julia 4
linda@babbleopia.biz mildred 3
helen@mycat.name douglas 4
kathleen@kaymbo.com nancy 1
teresa@zoombeat.name melissa 5
evelyn@skalith.com stephanie 6
...
...
2017年1月18日 02:33
編輯回答
懶洋洋

設(shè)想是在flask項目中,

from sqlalchemy import func

sbq = db.session.query(User.email, User.username, func.count(Comment.author_id).label("c_nums")).filter(User.id==Comment.author_id).subquery()

# data = sbq.query.order_by(sbq.c.c_nums.desc()).distinct().all()

data = db.session.query(User.email, User.username, sbq.c.c_nums).order_by(sbq.c.c_nums.desc()).distinct().all()

for d in data:
    print(d.email, d.username, d.c_nums)

用好sqlalchemy,可以扔掉那些所謂的外鍵關(guān)聯(lián)的寫法。

2017年3月1日 09:31
編輯回答
涼汐
import sqlalchemy

comment_sub = Comment.query.group_by(Comment.author_id).with_entities(Comment.author_id, sqlalchemy.func.count(Comment.author_id).label('count')).subquery()
result = db.session.query(User, comment_sub.c.count).join(comment_sub, User.id == comment_sub.c.author_id).order_by(comment_sub.c.count.asc()).all()

需要哪些參數(shù),自行在with_entities和下面的query中添加。
更改排序方式的話,自行更改asc或desc。

2018年3月18日 14:06