質問

このような単純な参加クエリをやろうとしています

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)
.

私はフラスコを使っています。ルートを呼び出すとこのエラーが発生します。

AttributeError: 'ColumnProperty' object has no attribute 'mapper'
.

私は基本的にこれを望んでいます:

|      id       |    food_name    |    food_category    |
.

と他のテーブルにあるフードカテゴリの実際の名前に置き換えられた

私のテーブル/関係は正しく設定されていますか?私のクエリは正しく設定されていますか?

役に立ちましたか?

解決

テーブルと関係は正しく設定されています。クエリには変更が必要です。

エラーの理由は、テーブル(またはマッピングモデルオブジェクト)の代わりに列(Food_Categories.food_categories)に結合を実行しようとすることです。技術的には、エラーを修正するために、クエリを下のものに置き換える必要があります。

results = Food.query.join(Food_Categories).all()
.

これはエラーを修正しますが、希望するSQLステートメントは生成されません。

あなたが念頭に置いているFood文を正確に生成するクエリを構築するために:

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)
.

この場合、結果はSQLのインスタンスではなく、むしろ3列の値を持つFoodです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top