【问题标题】:Sort by Count of Many to Many Relationship - SQLAlchemy按多对多关系的计数排序 - SQLAlchemy
【发布时间】:2014-08-25 06:09:44
【问题描述】:

我正在使用 Flask-SQLAlchemy 来查询我的 Postgres 数据库。

我目前正在尝试使用以下查询来查询标题建议:

res = Title.query.filter(Titles.name.ilike(searchstring)).limit(20)

到目前为止一切顺利。

现在我想按每个 Title 对象的“订阅者”数量对结果进行排序。

我知道以下 SO 问题:SQLAlchemy ordering by count on a many to many relationship 但是它的解决方案对我不起作用。

我收到以下错误:

ProgrammingError: (ProgrammingError) column "publishers_1.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...itles_name, count(titles_users.user_id) AS total, publishers...

(Publisher 与 Title 模型是一对多的关系)

我知道答案与子查询有关

下面是我的两个模型的简化示例。

# Many-to-Many relationship for user and titles
titles_users = db.Table('titles_users',
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('title_id', db.Integer, db.ForeignKey('titles.id'))
)

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    # ids
    id = db.Column(db.Integer, primary_key=True)
    # Attributes
    email = db.Column(db.String(255), unique=True)
    full_name = db.Column(db.String(255))

    pull_list = db.relationship(
        'Title',
        secondary=titles_users,
        backref=db.backref('users', lazy='dynamic'),
        lazy='joined'
    )


class Title(db.Model):
    __tablename__ = 'titles'
    #: IDs
   id = db.Column(db.Integer(), primary_key=True)
   #: Attributes
   name = db.Column(db.String(255))

【问题讨论】:

  • 您能告诉我们为什么链接的 SO 问题中的解决方案对您不起作用吗?你有什么错误吗?
  • 我已经用我收到的错误更新了帖子。

标签: python postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

以下代码适用于您描述的模型:

q = (db.session.query(Title, func.count(names_users.c.user_id).label("total"))
        .filter(Title.name.ilike(searchstring))
        .outerjoin(names_users).group_by(Title).order_by('total DESC')
    )
for x in q:
    print(x)

但是,您的错误包括一些其他数据,例如 publisher 或类似的。因此,如果以上内容没有帮助,您应该在您的问题中添加更多信息。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2018-03-04
    • 2016-08-06
    相关资源
    最近更新 更多