在sqlalchemy

时间:2018-05-28 16:21:24

标签: python postgresql sqlalchemy

我有一个包含一些文本字段和许多关系的表。我在查询只有一些字段时遇到了问题。这是我查询表的方式:

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)

但我必须自己做所有的加入。

0 个答案:

没有答案