2011-05-12 41 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

相关问题