【问题标题】:Flask SQLAlchemy query with order_by returns error no such column带有 order_by 的 Flask SQLAlchemy 查询返回错误没有这样的列
【发布时间】:2020-02-18 20:45:15
【问题描述】:

这是我的模型:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
db = SQLAlchemy(app)


class Person(db.Model):
    __tablename__ = 'persons'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False, unique=True)
    pets = db.relationship('Pet', backref='owner', lazy='dynamic')

    def __init__(self, *args, **kwargs):
        super(Person, self).__init__(*args, **kwargs)

    def __repr__(self):
        return f'<Person id:{self.id} name:{self.name}>'

class Pet(db.Model):
    __tablename__ = 'pets'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False, unique=True)
    owner_id = db.Column(db.Integer, db.ForeignKey('persons.id'), nullable=False)

    def __init__(self, *args, **kwargs):
        super(Pet, self).__init__(*args, **kwargs)

    def __repr__(self):
        return f'<Pet id:{self.id} name:{self.name} owner_id:{self.owner_id}>'

我正在尝试使用此查询获取按宠物数量排序的人员列表:

persons = Person.query.order_by(Person.pets).all()

得到这个错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: pets.owner_id
[SQL: SELECT persons.id AS persons_id, persons.name AS persons_name
FROM persons ORDER BY persons.id = pets.owner_id]

我做错了什么? 我有一个建议,我需要使用 join() 提出请求,但是在 google 中的研究没有给出可行的解决方案。

【问题讨论】:

    标签: python sql flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    如果您检查 SQL,您会注意到没有 FROM 项 pets,因此 ORDER BY persons.id = pets.owner_id 失败。发生这种情况是因为关系属性Person.pets 在查询上下文中呈现为其ON 子句,或者换句话说,呈现为persons.id = pets.owner_id。有很多方法可以形成正确的查询,例如使用JOINGROUP BY

    Person.query.\
        outerjoin(Person.pets).\
        group_by(Person.id).\
        order_by(func.count(Pet.id)).\
        all()
    

    LEFT OUTER JOIN 确保也考虑没有宠物的人。

    【讨论】:

    • 这个查询对我有一些修改。在我的例子中使用db.func.count(Pet.id) 而不是func.count(Pet.id)
    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多