sqlalchemy一对多关系加入?
作者:互联网
我正在尝试这样的简单联接查询,
SELECT food._id, food.food_name, food_categories.food_categories FROM food JOIN food_categories ON food.food_category_id = food_categories._id
但仍会收到错误消息.这是我的班级设置方式.
class Food_Categories(db.Model):
__tablename__ = 'food_categories'
_id = db.Column(db.Integer, primary_key=True)
food_categories = db.Column(db.String(30))
class Food(db.Model):
__tablename__ = 'food'
_id = db.Column(db.Integer, primary_key=True)
food_name = db.Column(db.String(40))
food_category_id = db.Column(db.Integer, ForeignKey(Food_Categories._id))
food_category = relationship("Food_Categories")
我的查询功能如下所示.
@app.route('/foodlist')
def foodlist():
if request.method == 'GET':
results = Food.query.join(Food_Categories.food_categories).all()
json_results = []
for result in results:
d = {'_id': result._id,
'food': result.food_name,
'food_category': result.food_categories}
json_results.append(d)
return jsonify(user=json_results)
我正在使用Flask.当我呼叫路线时,出现此错误.
AttributeError: 'ColumnProperty' object has no attribute 'mapper'
我本质上想要这样:
| id | food_name | food_category |
并将food_category_id列替换为位于其他表中的食品类别的实际名称.
我的表/关系设置正确吗?我的查询设置正确吗?
解决方法:
您的表和关系已正确设置.您的查询需要更改.
错误的原因是您尝试对列(Food_Categories.food_categories)而非表(或映射的模型对象)执行联接.从技术上讲,您应该使用以下查询替换您的查询以修复错误:
results = Food.query.join(Food_Categories).all()
这将解决错误,但不会生成您想要的SQL语句,因为即使存在联接,它也只会作为结果返回Food的实例.
为了构建一个查询,该查询将准确生成您要记住的SQL语句:
results = (db.session.query(Food._id, Food.food_name,
Food_Categories.food_categories,)
.join(Food_Categories)).all()
for x in results:
# print(x)
print(x._id, x.food_name, x.food_categories)
请注意,在这种情况下,结果不是Food的实例,而是具有3列值的元组.
标签:sqlalchemy,flask,flask-sqlalchemy,python 来源: https://codeday.me/bug/20191121/2055021.html