我有一个包含一些文本字段和许多关系的表。我在查询只有一些字段时遇到了问题。这是我查询表的方式:
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
param。
当我在查询参数中指定字段时,我必须自己完成所有连接,但我不想要这样做;还尝试使用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)
但我必须自己做所有的加入。