SQLAlchemy ORM动态连接不返回所有已连接表

时间:2017-09-20 20:28:26

标签: python join orm sqlite sqlalchemy

我是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打印到屏幕时):

queryset:SELECT scope.id AS scope_id,scope.location_id AS scope_location_id,scope.entry AS scope_entry,scope.type AS scope_type,location.name AS location_name,location.modified_by AS location_modified_by,
FROM范围JOIN位置ON location.id = scope.location_id

我想要的最终结果是:所有列的字典列表(来自两个表 - 就像常规内部连接一样,只有一个表)。

但是,当我输入(queryset)时,我正在获取一个列表,当我只是尝试在查询集中执行 [u._asdict()for you 时,这是我返回列表的方法在没有连接的查询中的字典,它只返回每个表中1列的字典列表(__repr__中的列。

我需要返回两个表中的所有列。

现在这就是我得到的结果: [{'范围':192.168.0.0/24,'位置':主要},...]

我需要类似的东西,其中连接中的所有列都在字典列表中返回: [{' Scope.entry':192.168.0.0/24,' Scope.type':' virtual',' Location .name':main,' Location.modified_by':' jim'},...]

在我的代码中,实例& join_classes是动态传递的而不是硬编码的,因为不同的函数会传递表模型来连接(第一个模型表是所有进行连接的表)。我需要这个来处理多个表上的连接(但是所有表都将连接到第一个模型表,本例中为Scope。)

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

1 个答案:

答案 0 :(得分:0)

好吧,写完一些东西肯定会帮助你弄清楚答案。

对于任何可能受益的人都是我所做的。我确信有一种更有说服力的方法可以做到这一点,所以如果是的话请告诉我。

我终于正确阅读了我的输出并意识到它给了我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表模型对象转换为字典列表的函数。