Domanda

Sto cercando di fare una semplice query di join come questo,

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

Ma continua a ricevere un errore.Ecco come sono le mie lezioni.

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

La mia funzione di query è simile a questa.

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

Sto usando Bock.Quando chiamo il percorso ottengo questo errore.

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

Voglio essenzialmente questo:

|      id       |    food_name    |    food_category    |
.

e avere la colonna Food_category_ID sostituita con il nome effettivo della categoria alimentare situata in un'altra tabella.

Le mie tabelle / relazioni sono impostate correttamente?La mia configurazione della query è correttamente?

È stato utile?

Soluzione

Le tabelle e le relazioni sono configurate correttamente.La tua query ha bisogno di un cambiamento.

Il motivo per un errore è il fatto che si tenta di eseguire un join sulla colonna (Food_Categories.food_categories) anziché una tabella (o oggetto modello mappato).Tecnicamente, è necessario sostituire la tua query con quella sottostante per correggere l'errore:

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

Questo risolverà l'errore, ma non generare l'istruzione SQL che desideri, poiché restituirà le istanze di Food solo come risultato anche se c'è un join.

Per creare una query che genererà esattamente l'istruzione SQL che hai in 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)
.

Si prega di notare che in questo caso i risultati non sono istanze di Food, ma piuttosto tuples con 3 valori di colonna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top