sqlalchemy中使用manytomy关系强制内部连接

2024-09-27 23:15:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用声明性的_base(),并试图找出在使用多对多关系时如何强制执行延迟内部联接。在

我在MySQL和InnoDB中有定义了外键约束的表。在

users: userid, name
permissions: permissionid, name
users_permissions: userid, permissionid

我正在使用metadata.reflect()来加载我的数据库。在

^{pr2}$

只要我选择

u = Session().query(User).filter(User.name == 'myuser').first()
u.permissions

服务器接收到的查询:

SELECT permissions.permissionid AS permissions_permissionid,
     permissions.name AS permissions_name
FROM permissions, users_permissions 
WHERE ? = users_permissions.userid
    AND permissions.permissionid = users_permissions.permissionid
ORDER BY permissions.name

如我们所见,FROM permissions, users_permissions不是内部联接。我可以在不使用lazy=False的情况下强制执行此操作,因为如果我这样做,级联效果将是加载太多信息,因为permissions也与另一个表(示例中未提及)相关,users也与其他表相关(同样,在示例中未提及)。我想对我所有的类使用相同的关系模板。在

编辑:CONTEXT我正在尝试复制所有的SQL查询,以匹配当前系统中的查询。我正在尝试从oursql迁移到sqlalchemy orm。在


Tags: namefrom声明permissions示例base关系as
1条回答
网友
1楼 · 发布于 2024-09-27 23:15:29

MySQL正在执行内部联接;也就是说,您所显示的查询是内部联接的一个实现。在

docs

innerjoin=False – when True, joined eager loads will use an inner join to join against related tables instead of an outer join. The purpose of this option is strictly one of performance, as inner joins generally perform better than outer joins. This flag can be set to True when the relationship references an object via many-to-one using local foreign keys that are not nullable, or when the reference is one-to-one or a collection that is guaranteed to have one or at least one entry.

关键点是inner join vs. outer join。语法无关。在

请注意,可以使用inner join语法形式将查询转换为查询,该语法形式具有完全相同的含义:

SELECT permissions.permissionid AS permissions_permissionid,
     permissions.name AS permissions_name
FROM permissions
INNER JOIN users_permissions 
    ON permissions.permissionid = users_permissions.permissionid
WHERE ? = users_permissions.userid
ORDER BY permissions.name

MySQL通常会为这两个表单生成相同的执行计划。在

相关问题 更多 >

    热门问题