Sqlalchemy объединяет отношения «один ко многим»?
-
21-12-2019 - |
Вопрос
Я пытаюсь выполнить простой запрос на соединение, подобный этому:
SELECT food._id, food.food_name, food_categories.food_categories FROM food JOIN food_categories ON food.food_category_id = food_categories._id
но продолжает получать ошибку.Вот как устроены мои занятия.
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")
Моя функция запроса выглядит следующим образом.
@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)
Я использую Фласк.Когда я вызываю маршрут, я получаю эту ошибку.
AttributeError: 'ColumnProperty' object has no attribute 'mapper'
По сути, я хочу этого:
| id | food_name | food_category |
и замените столбец food_category_id фактическим названием категории продуктов питания, расположенным в другой таблице.
Правильно ли настроены мои таблицы/связи?Правильно ли настроен мой запрос?
Решение
Ваши таблицы и отношения настроены правильно.Ваш запрос нуждается в изменении.
Причиной ошибки является то, что вы пытаетесь выполнить соединение по столбцу (Food_Categories.food_categories
) вместо таблицы (или сопоставленного объекта модели).Технически вам следует заменить ваш запрос на приведенный ниже, чтобы исправить ошибку:
results = Food.query.join(Food_Categories).all()
Это устранит ошибку, но не создаст SQL
утверждение, которое вы хотите, потому что оно вернет экземпляры Food
только в результате, даже если есть соединение.
Чтобы построить запрос, который будет генерировать именно SQL
утверждение, которое вы имеете в виду:
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)
Обратите внимание, что в этом случае результаты не являются примерами Food
, скорее tuples
с тремя значениями столбца.