名前からORMマップされたモデルクラスを取得することは可能ですか?
間違いなく、SQLAlchemy にはこの機能がどこかに組み込まれています。たとえば、宣言型スタイルでは、次のように記述できますblahs = relationship('Blah')
(注意: モジュールの接頭辞は必要ありません)。中をのぞいてみましたが、紐がsqlalchemy.orm.properties.RelationshipProperty
いつargument
交換されて現物なのかわかりません。
名前からORMマップされたモデルクラスを取得することは可能ですか?
間違いなく、SQLAlchemy にはこの機能がどこかに組み込まれています。たとえば、宣言型スタイルでは、次のように記述できますblahs = relationship('Blah')
(注意: モジュールの接頭辞は必要ありません)。中をのぞいてみましたが、紐がsqlalchemy.orm.properties.RelationshipProperty
いつargument
交換されて現物なのかわかりません。
リゾルバーはパブリックにアクセスできません。関数が使用されてsqlalchemy.ext.declarative._deferred_relationship
おり、ネストされた (隠し)resolve_arg
関数があります。
この関数は、次のロジックを使用して名前を解決します。
def access_cls(key):
if key in cls._decl_class_registry:
return _GetColumns(cls._decl_class_registry[key])
elif key in cls.metadata.tables:
return cls.metadata.tables[key]
elif key in cls.metadata._schemas:
return _GetTable(key, cls.metadata)
else:
return sqlalchemy.__dict__[key]
ここcls
で、宣言型クラス (から派生Base
) です。コードからわかるように、名前を解決する 1 つの方法は、cls._decl_class_registry
構造体を使用することです。 class が与えられた場合、 を使用して文字列をクラスにFoo
解決できます。'Blah'
Foo._decl_class_registry['Blah']
._decl_class_registry
構造は単なる pythondict
です。Base
クラスを作成するときに、独自のマッパーを指定することもできます。
class_registry = {}
Base = declarative_base(class_registry=class_registry)
class_registry
その後、マッピングでクラスを直接検索できます。