Sqlalchemy relación de uno a varios unirse?
-
21-12-2019 - |
Pregunta
Estoy tratando de hacer una simple consulta de combinación como esta,
SELECT food._id, food.food_name, food_categories.food_categories FROM food JOIN food_categories ON food.food_category_id = food_categories._id
pero seguir recibiendo un error.Aquí es cómo mis clases son de instalación.
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")
Mi consulta función este aspecto.
@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)
Estoy utilizando un Matraz.Cuando me llame la ruta me sale este error.
AttributeError: 'ColumnProperty' object has no attribute 'mapper'
Esencialmente me quiero esto:
| id | food_name | food_category |
y tienen la food_category_id columna reemplazado con el nombre real de la categoría de alimentos ubicada en otra tabla.
Son mis tablas, relaciones configurado correctamente?Es mi consulta el programa de instalación correctamente?
Solución
Las tablas y las relaciones de la instalación correctamente.Su consulta se necesita un cambio.
La razón de un error es el hecho de que intenta realizar una combinación en la columna (Food_Categories.food_categories
) en lugar de una Tabla (o asignada modelo de objeto).Técnicamente, se debe reemplazar la consulta con la de abajo, para corregir el error:
results = Food.query.join(Food_Categories).all()
Esto va a corregir el error, pero no generan la SQL
declaración de que el deseo, porque va a devolver instancias de Food
sólo como resultado pesar de que hay una combinación.
Con el fin de construir una consulta que va a generar exactamente el SQL
declaración de que usted tiene en mente:
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)
Por favor, tenga en cuenta que en este caso los resultados no son instancias de Food
, pero en lugar tuples
con 3 valores de la columna.