Sqlalchemy um para muitos relacionamentos se juntam?
-
21-12-2019 - |
Pergunta
Estou tentando fazer uma consulta de junção simples 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
mas continuo recebendo um erro.Aqui está como minhas aulas são configuradas.
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")
Minha função de consulta é assim.
@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)
Estou usando o Flask.Quando chamo a rota, recebo esse erro.
AttributeError: 'ColumnProperty' object has no attribute 'mapper'
Eu essencialmente quero isso:
| id | food_name | food_category |
e substitua a coluna food_category_id pelo nome real da categoria de alimentos localizada em outra tabela.
Minhas tabelas/relacionamentos estão configurados corretamente?Minha consulta está configurada corretamente?
Solução
Suas tabelas e relacionamentos estão configurados corretamente.Sua consulta precisa de uma mudança.
O motivo do erro é o fato de você tentar realizar uma junção na coluna (Food_Categories.food_categories
) em vez de uma Tabela (ou objeto de modelo mapeado).Tecnicamente, você deve substituir sua consulta pela abaixo para corrigir o erro:
results = Food.query.join(Food_Categories).all()
Isso corrigirá o erro, mas não gerará o SQL
declaração que você deseja, porque ela retornará instâncias de Food
apenas como resultado, mesmo que haja uma junção.
Para construir uma consulta que irá gerar exatamente o SQL
declaração que você tem em 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)
Observe que, neste caso, os resultados não são instâncias de Food
, mas sim tuples
com 3 valores de coluna.