У меня есть таблица с некоторыми текстовыми полями и множеством взаимосвязей.У меня проблемы с запросом только некоторых полей.Вот как я запрашиваю таблицу:
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)
Но я должен сделать все соединения сам.