Frage

Dies ist ein vereinfachtes Beispiel meiner aktuellen Modelle (Ich verwende die Flask SQLAlchemy-Erweiterung):

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'
    )

Ich versuche zu bestellen Postist um die Menge Likes es hat.

Dies ist die Abfrage, die ich grundsätzlich stellen möchte:

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

Ich konnte einfach nichts auf der SQLAlchemy-Seite zum Laufen bringen.

Vielen Dank für jede Hilfe, die jemand anbieten kann.

War es hilfreich?

Lösung

Ich habe SQLAlchemy nicht oft verwendet, also dachte ich, ich versuche es mal.Ich habe nicht versucht, Ihre Modelle zu verwenden, sondern nur ein paar neue geschrieben (allerdings ähnlich genug):

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

Sie möchten dem beitreten likes Tisch, Verwendung func.count Likes zählen, group_by Post und dann verwenden order_by:

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

ich fand die ORM-Tutorial und der Rest der SQLAlchemy-Dokumentation ist sehr nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top