Запросить конкретные столбцы типа отношений в sqlalchemy - PullRequest
0 голосов
/ 28 мая 2018

У меня есть таблица с некоторыми текстовыми полями и множеством взаимосвязей.У меня проблемы с запросом только некоторых полей.Вот как я запрашиваю таблицу:

with db.session(raise_err=True) as session:
    result = session.query(
        ClientKnowledge
    ).options(
        *[defaultload(getattr(ClientKnowledge, table.table.name))
          .load_only(KqFactory().get_tables([table.table.name])[0].get_pk().name)
          for table in ClientKnowledge.__mapper__.relationships]
    ).filter(
        ClientKnowledge.id == 1
    )

Это работает нормально, SQLAlchemy выполняет все соединения для меня и хорошо использует параметр lazy=joinedload.

Когда я указываю поля в запросепараметры Я должен сделать все соединения сам, но я не хочу этого;также пытался использовать with_entities() и сделать запрос с другой стороны отношения, но получил тот же результат.

Есть ли способ, которым я могу запрашивать только определенные поля, не теряя способность SQLAlchemy создавать объединениядля меня?

PS: Я не могу привести полный рабочий пример, так как все мои таблицы генерируются динамически.Пожалуйста, скажите мне, если нужно больше контекста.

РЕДАКТИРОВАТЬ:

вот пример того, как мои таблицы выглядят

@as_declarative()
class RightTable1:
    id = Column(Integer, primary_key=True)
    desc = Text()


@as_declarative()
class RightTable2:
    id = Column(Integer, primary_key=True)
    desc = Text()


@as_declarative()
class Association1:
    __tablename__ = 'association1'
    left_id = Column(Integer, ForeignKey(ClientKnowledge.rel_field1), primary_key=True)
    right_id = Column(Integer, ForeignKey(RightTable1.id), primary_key=True)


@as_declarative()
class Association2:
    __tablename__ = 'association2'
    left_id = Column(Integer, ForeignKey(ClientKnowledge.rel_field2), primary_key=True)
    right_id = Column(Integer, ForeignKey(RightTable2.id), primary_key=True)


@as_declarative()
class ClientKnowledge:
    id = Column(Integer, primary_key=True)
    text_field = Text()
    rel_field1 = relationship(
        kq_table, secondary=Association1.__table__, lazy='joined',
        backref=backref(RightTable1.__table__.name, lazy='joined')
    )
    rel_field2 = relationship(
        kq_table, secondary=Association2.__table__, lazy='joined',
        backref=backref(RightTable2.__table__.name, lazy='joined')
    )

, что я хочу иметь возможность запрашиватьClientKnowledge.rel_field1.

Я пробовал:

session.query(ClientKnowledge.rel_field1)

Но я должен сделать все соединения сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...