这是我的模特:
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的研究并未提供有效的解决方案。
答案 0 :(得分:0)
如果检查SQL,则会注意到没有FROM项目pets
,因此ORDER BY persons.id = pets.owner_id
失败。之所以会发生这种情况,是因为关系属性Person.pets
在查询上下文中表示为其ON
子句,换句话说,表示为persons.id = pets.owner_id
。形成适当查询的方法有很多,例如使用JOIN
和GROUP BY
:
Person.query.\
outerjoin(Person.pets).\
group_by(Person.id).\
order_by(func.count(Pet.id)).\
all()
LEFT OUTER JOIN
确保还考虑了没有宠物的人。