【问题标题】:Sqlalchemy one to many relationship join?Sqlalchemy 一对多关系连接?
【发布时间】:2014-05-26 09:28:28
【问题描述】:

我正在尝试做一个像这样的简单连接查询,

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 列替换为位于其他表中的食品类别的实际名称。

我的表/关系设置是否正确?我的查询设置是否正确?

【问题讨论】:

    标签: python sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    您的表和关系设置正确。您的查询需要更改。

    错误的原因是您尝试在列 (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

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 2021-08-31
      • 2012-06-14
      • 2019-12-06
      • 1970-01-01
      相关资源
      最近更新 更多