سؤال

أحاول أن أفعل استعلام الانضمام بسيط مثل هذا,

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 قيم العمود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top