【发布时间】: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