簡體   English   中英

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM