sqlite SQLAlchemy ORM动态连接不返回所有连接表中的所有列

h22fl7wq  于 2023-01-26  发布在  SQLite
关注(0)|答案(2)|浏览(138)

我是sqlalchemy的新手。所以任何帮助都是感激的。我有一个函数为我的应用程序构造我的查询。我传递给它一个要连接的表的列表。
下面是相关的代码片段。

class Scope(Base):
    entry = Column(String(512))
    location_id = Column(Integer, ForeignKey('location_id'))
    type = Column(String(128))

class Location(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String(512)
    modified_by = Column(String(128))

instances = [Scope, Location]
join_classes = [Location]

queryset = session.query(*instances).join(*join_classes).all()

下面是运行的SQL查询(当我在.all()之前将queryset打印到屏幕时):
查询集:SELECTscope.idAS范围标识,范围.位置标识AS范围位置标识,范围.条目AS范围条目,范围.类型AS范围类型,location.nameAS位置名称,位置.修改者AS位置修改者,
从作用域连接位置在location.id=作用域.位置ID
我想要的最终结果是:所有列的字典列表(来自两个表-类似于常规内部连接,给出单个表)。
然而,当我输入(queryset)时,我得到了一个列表,当我只是尝试执行**[u._asdict()for u in queryset]时,这是我在没有连接的查询中返回字典列表的方式,它只返回每个表中1列的字典列表(__repr__中的列)。
我需要返回两个表中的所有列。
现在我得到的是这样的:
[{“范围”:192.168.0.0/24,“位置”:主要},...]**
我需要这样的代码,其中连接中的所有列都在字典列表中返回:***[{“范围条目”:192.168.0.0/24,“作用域类型”:“虚拟”、“位置.名称”:main,“位置.修改者”:'jim'},...]***
在我的代码中,示例& join_classes是动态传递的,而不是硬编码的,因为不同的函数传递要连接的表模型(第一个模型表是所有进行连接的表)。我需要这样来处理多个表的连接(但所有表都将连接到第一个模型表,在本例中为Scope)。

编辑:我终于意识到我正在取回一个sqlalchemy表对象列表。这就是为什么我在显示时得到__repr__值的原因。

inb24sb2

inb24sb21#

那么,写一些已经完成的事情肯定会帮助你找到答案。
对于任何可能受益的人,这就是我所做的。我相信有一个更雄辩的方式来做到这一点,所以请让我知道如果是这样。
我终于正确地阅读了输出,意识到它给了我2个表模型对象(每个连接表1个),然后我对每个对象进行迭代,将每次迭代转换为字典列表,然后适当地合并这些字典,这样我就有了一个字典列表,就像内部连接表给我的一样。
下面是我的一些代码:

for obj in queryset:
    result.append(queryset_to_dict(obj))

for r in result:
    new_dict = {}
    for inner in r:
        new_dict = {**new_dict, **inner}
    new_result.append(new_dict)
  • 注意queryset_to_dict是我创建的一个函数,用于将sqlalchemy表模型对象转换为字典列表。
qmelpv7a

qmelpv7a2#

records = DBSession.query(GeneralLedger, ConsolidatedLedger).join(ConsolidatedLedger, GeneralLedger.invoiceId == ConsolidatedLedger.invoiceId).all()

这种查询返回两个表数据

相关问题