Заклятый враг SQL, сопоставляет пользовательский запрос с классом

#python #orm #sqlalchemy

#python #orm #sqlalchemy

Вопрос:

У меня есть класс, который содержит идентификатор автора и идентификатор статьи:

 class SearchResults(Base):
    __abstract__ = True
    author_id = Column(String)
    article_id = Column(String)
  

Я хотел бы вернуть только два столбца: author_id, article_id (фильтрация исключена из приведенных ниже примеров)

У этого класса не может быть соответствующей таблицы, пока она является результатом поискового запроса.

Я изо всех сил пытаюсь автоматически сопоставить его с классом с заклятым врагом SQL. Когда класс передается как аргумент запроса, подобный этому:

 search_results = db.query(SearchResults).select_from(models.Article).join(models.Author).all()
  

Сбой ORM с ошибкой:

  sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got '<class 'app.db.models.SearchResults'>'
  

Когда указаны столбцы, я получаю кортеж вместо класса:

 search_results = db.query(models.Acticle.id, models.Author.author_id).select_from(models.Article).join(models.Author).all()
  

возможно ли сопоставить результаты, отличные от таблицы, с классом?

Ответ №1:

Пожалуйста, взгляните на сопоставление класса с произвольными выборками или сопоставление класса с несколькими таблицами разделов документации.

Для второго примера вы можете получить таблицы для Article и Author с помощью:

 author_table = models.Author.__table__
article_table = modesl.Article.__table__