私は 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 クエリと一致するように、すべての SQL クエリを複製しようとしています。oursql
からに移行しようとしていsqlalchemy orm
ます。