سكلالكيمي واحد للعديد من العلاقات انضم?
-
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
فقط نتيجة لذلك على الرغم من وجود انضمام.
من أجل بناء استعلام والتي سوف تولد بالضبط 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
, ، ولكن بالأحرى tuples
مع 3 قيم العمود.