2011-05-12 72 views
21

這是我目前的模型的一個簡單的例子(我使用的是Flask SQLAlchemy extensionSQLAlchemy的順序通過在許多計數一對多的關係

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的一側工作。

感謝任何人可以提供的幫助。

回答

35

我還沒有使用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_byPost然後用order_by

db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC') 

我發現ORM tutorial和SQLAlchemy的文檔非常有用的其餘部分。

+0

嘿,謝謝你的回答。幾件事情要注意。查詢結尾處有一個額外的括號。 MySQL不喜歡''-total''(儘管總DESC'工作正常)_。另外,我認爲將id設置爲'.group_by(Post.id)'可能會更好。最後我遇到了'func.count(likes)'的問題。它正在翻譯成一個空數_('COUNT()')_。提供一個列,通過'func.count(likes.c.did)'固定它。再次感謝。 – anomareh 2011-05-12 09:06:04

+0

@anomareh太棒了,很高興它有幫助。我會更新我的答案,所以它(希望)更通用。我想知道這裏有不同的SQLAlchemy版本嗎?我正在使用0.7b4。 – zeekay 2011-05-12 09:18:41

+0

可能,我正在使用0.6.7。 – anomareh 2011-05-12 09:39:01