带order_by的烧瓶SQLAlchemy查询返回错误没有这样的列

时间:2020-02-18 20:45:15

标签: python sql flask sqlalchemy flask-sqlalchemy

这是我的模特:

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的研究并未提供有效的解决方案。

1 个答案:

答案 0 :(得分:0)

如果检查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确保还考虑了没有宠物的人。