SQLAlchemy uspořádání by se spolehnout na mnoho mnoho vztahů

hlasů
22

Jedná se o zjednodušený příklad z mých současných modelů (jsem pomocí rozšíření baňky 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'
    )

Snažím se objednat Post‚s částkou likes to má.

To je dotaz, jsem v podstatě se snaží problém vyřešit:

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

Jen jsem nebyl schopen dostat něco pracuje na straně SQLAlchemy věcí.

Díky za každou pomoc kdokoli může nabídnout.

Položena 12/05/2011 v 06:12
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
37

Osobně jsem nepoužil SQLAlchemy moc, tak jsem myslel, že bych to zkusit. Nesnažil jsem se využít své modely, jen jsem napsal nějaké nové (dost podobná ačkoli):

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

Chcete-li vstoupit do likestabulky, použijte func.countpočítat rád, group_by Posta pak použít order_by:

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

Našel jsem ORM tutoriál a zbytek dokumentace SQLAlchemy velmi užitečnou.

Odpovězeno 12/05/2011 v 09:33
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more