SQLAlchemy объединенная таблица наследования: как сделать запрос SELECT с помощью LEFT OUTER JOIN - PullRequest
0 голосов
/ 17 июня 2019

Итак, у меня есть два класса SQLAlchemy:

class Report(Base):
    """
    Parent class.
    """

    __tablename__ = 'report'

    record_id = Column(Integer, primary_key=True)
    contact = Column(String(30))
    survey_date = Column(DateTime)
    project = Column(String(100))

    __mapper_args__ = {
        'polymorphic_on': project,
    }


class Survey(Report):
    """
    Child class.
    """
    __tablename__ = 'some_project_survey'

    record_id = Column(Integer, ForeignKey('report.record_id'), primary_key=True)
    form_status = Column(String(150))
    form_comment = Column(String(500))

    __mapper_args__ = {'polymorphic_identity': 'some_project'}

При определенных условиях новым объектам Survey могут быть назначены все поля для None.Поэтому таблица some_project_survey может содержать строки NULL (все поля имеют значение NULL, кроме record_id).И таких строк много.В таких случаях я решил создать только объекты отчета, а не объекты съемки.Проблема заключается в выборе объектов съемки из базы данных.Стандартный метод использует INNER JOIN, поэтому объекты отчета, для которых нет записей в таблице some_project_survey, не возвращаются.

Затем я решил использовать функцию with_polymorphic:

entity = with_polymorphic(Report, Survey)
pi = Survey.__mapper_args__['polymorphic_identity']
query = self.session.query(entity)
query = query.filter(entity.reply_project == pi)
result = query.all()

И это сработало.Но если объект существует в таблице отчета и не существует в таблице some_project_survey, этот метод возвращает объект с атрибутом report_id, равным None.

Существует ли правильный способ выбора объектов Survey в таких обстоятельствах?

ОБНОВЛЕНИЕ:

Текущий подход:

entity = with_polymorphic(Report, Survey)
pi = Survey.__mapper_args__['polymorphic_identity']
query = self.session.query(entity, Report.record_id)
query = query.filter(entity.reply_project == pi)
result = query.all()
records = []
for row in result:
    row[0].record_id = row[1]
    records.append(row[0])
return records
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...