Question

Je suis en train de faire une simple requête de jointure comme ceci,

SELECT food._id, food.food_name, food_categories.food_categories FROM food JOIN food_categories ON food.food_category_id = food_categories._id

mais continuez à recevoir un message d'erreur.Voici comment mes cours sont le programme d'installation.

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

Ma fonction de requête ressemble à ceci.

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

Je suis en utilisant la Fiole.Lorsque j'appelle la route, j'obtiens cette erreur.

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

J'ai essentiellement veux ceci:

|      id       |    food_name    |    food_category    |

et ont le food_category_id colonne remplacé par le nom de la catégorie d'aliments situés dans une autre table.

Sont mes tables/relations de mettre en place correctement?Est ma requête de configuration correctement?

Était-ce utile?

La solution

Vos tables et les relations sont configurés correctement.Votre requête a besoin d'un changement.

La raison pour laquelle une erreur est le fait que vous essayez d'effectuer une jointure sur la colonne (Food_Categories.food_categories) au lieu d'une Table (ou mappé modèle objet).Techniquement, vous devriez remplacer votre requête avec celui ci-dessous pour corriger l'erreur:

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

Cela va corriger l'erreur, mais ne génère pas l' SQL la déclaration de volonté, car il sera de retour instances de Food seulement comme un résultat, même si il y a une jointure.

Dans le but de construire une requête qui permet de générer exactement le SQL déclaration que vous avez à l'esprit:

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)

Veuillez noter que dans ce cas, les résultats ne sont pas des instances de Food, mais plutôt tuples avec 3 valeurs de la colonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top