Sqlalchemy присоединиться к одному из многих отношений?

Я пытаюсь сделать простой запрос соединения, как это,

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) 

Я использую Flask. Когда я вызываю маршрут, я получаю эту ошибку.

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

Я действительно хочу этого:

 | id | food_name | food_category | 

и замените столбец food_category_id фактическим названием категории продуктов, находящейся в другой таблице.

Правильно ли настроены мои таблицы / отношения? Правильно ли настроен мой запрос?

One Solution collect form web for “Sqlalchemy присоединиться к одному из многих отношений?”

Ваши таблицы и отношения настроены правильно. Ваш запрос нуждается в изменении.

Причиной ошибки является тот факт, что вы пытаетесь выполнить соединение в столбце ( 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 с 3 значениями столбца.

  • Почему Flask-migrate не может обновляться при столбце падения
  • Тесты флаконов с SQLAlchemy и PostgreSQL исчерпывают соединения db
  • массовые значения списка вставки с SQLAlchemy Core
  • Возможно, SQLAlchemy может совместно использовать базу данных SQLite из нескольких процессов Python?
  • Каковы преимущества использования Elixir
  • SQLAlchemy ORM с динамической схемой таблиц
  • Кол-во sqlalchemy много-ко-многим вставить данные
  • Как найти класс или класс удаленных сторонних объектов sqlalchemy без запросов db?
  • Избегание «сервера MySQL ушло» на редко используемом сервере Python / Flask с SQLAlchemy
  • Как фильтровать в `sqlalchemy` строку длиной?
  • Список баз данных в SQLAlchemy
  • Python - лучший язык программирования в мире.