Sqlalchemy "un à plusieurs" de la relation de jointure?
-
21-12-2019 - |
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?
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.