【问题标题】:SQLAlchemy ORM dynamic join not returning all columns from all joined tablesSQLAlchemy ORM动态连接不返回所有连接表中的所有列
【发布时间】:2018-03-02 01:22:37
【问题描述】:

我是 sqlalchemy 的新手。所以任何帮助表示赞赏。 我有一个为我的应用程序构建查询的函数。我将要加入的表格列表传递给它。

这里是相关代码sn-ps。

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() 之前将查询集打印到屏幕时):

查询集: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 scope JOIN location ON location.id = scope.location_id

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

但是,当我键入(queryset)并且我只是尝试执行 [u._asdict() for u in queryset] 时,我得到了一个列表,这就是我返回列表的方式没有连接的查询中的字典,它只返回每个表中 1 列的字典列表(__repr__ 中的列。

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

现在这就是我得到的结果: [{'Scope': 192.168.0.0/24, 'Location': main}, ...]

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

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

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

【问题讨论】:

  • 你能改进你的代码格式吗?这将大大提高您问题的可读性。
  • 当然是这样。唯一的代码在块代码部分。我将突出显示我得到的结果和我想要的结果。

标签: python join orm sqlite sqlalchemy


【解决方案1】:

嗯,写一些已经完成的事情肯定会帮助你找出答案。

对于任何可能受益的人,这就是我所做的。我相信有一种更雄辩的方法可以做到这一点,如果有,请告诉我。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多