[英]How to specify the join condition on a many-to-many relationship using SQLAlchemy
[英]Forcing inner join with many-to-many relationship in sqlalchemy
我正在使用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
不是內部FROM permissions, users_permissions
。 我可以不使用lazy=False
來強制執行此操作嗎,因為如果這樣做,級聯效果將是加載太多信息,因為permissions
也與另一個表(示例中未提及)相關,並且users
也與其他表相關表(再次,在示例中未提及)。 我想為我所有的班級使用相同的模板來建立關系。
編輯: 上下文我正在嘗試復制所有SQL查詢以匹配來自當前系統的查詢。 我正在嘗試從oursql
遷移到oursql
sqlalchemy orm
。
MySQL 正在做一個內部聯接。 也就是說,您顯示的查詢是內部聯接的一種實現。
從文檔 :
innerjoin = False –當為True時,聯接的急切加載將使用內部聯接對相關表進行聯接,而不是外部聯接。 此選項的目的嚴格來說是性能之一,因為內部聯接的性能通常優於外部聯接。 當關系使用不可為空的本地外鍵通過多對一引用對象時,或者當引用是一對一或保證具有一個或至少一個集合時,可以將該標志設置為True。一個條目。
關鍵是內部聯接與外部聯接 。 語法無關緊要。
請注意,您可以使用具有完全相同含義的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通常會為這兩種形式生成相同的執行計划。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.