5

名前からORMマップされたモデルクラスを取得することは可能ですか?

間違いなく、SQLAlchemy にはこの機能がどこかに組み込まれています。たとえば、宣言型スタイルでは、次のように記述できますblahs = relationship('Blah')(注意: モジュールの接頭辞は必要ありません)。中をのぞいてみましたが、紐がsqlalchemy.orm.properties.RelationshipPropertyいつargument交換されて現物なのかわかりません。

4

1 に答える 1

11

リゾルバーはパブリックにアクセスできません。関数が使用されて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その後、マッピングでクラスを直接検索できます。

于 2012-12-16T16:47:47.420 に答える