我正在使用 declarative_base() 并试图弄清楚在使用多对多关系时如何强制执行惰性内部连接。
我在 MySQL 和 InnoDB 中有定义了外键约束的表。
users: userid, name
permissions: permissionid, name
users_permissions: userid, permissionid
我metadata.reflect()
用来加载我的数据库。
class User_Perm(Base):
__table__ = Base.metadata.tables['users_permissions']
class User(Base):
__table__ = Base.metadata.tables['users']
permissions = orm.relationship('Permission',
secondary=User_Perm.__table__,
order_by='Perm.name',
innerjoin=True,
lazy=True,
)
class Permission(Base):
__table__ = Base.metadata.tables['permissions']
每当我选择
u = Session().query(User).filter(User.name == 'myuser').first()
u.permissions
MySQL服务器收到的查询是:
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
也与其他表相关(同样,不是例子中提到)。我想为我所有的班级使用相同的模板来建立关系。
编辑:上下文我正在尝试复制所有 SQL 查询以匹配当前系统中的查询。我正在尝试从迁移oursql
到sqlalchemy orm
.