繁体   English   中英

Sqlalchemy一对多关系加入?

[英]Sqlalchemy one to many relationship join?

我想尝试这样一个简单的连接查询,

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列值的tuples

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM