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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top