Sqlalchemyが多くの関係に参加しますか?
-
21-12-2019 - |
質問
このような単純な参加クエリをやろうとしています
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
です。
所属していません StackOverflow