Is it possible to get an ORM-mapped model class from name?
Definitely SQLAlchemy has this functionality built-in somewhere. For instance in declarative style you can write things like blahs = relationship('Blah') (notice: no module prefix required). I tried looking inside sqlalchemy.orm.properties.RelationshipProperty but can't figure out when argument string is replaced by the actual thing.
The resolver is not publicly accessible; the sqlalchemy.ext.declarative._deferred_relationship function is used, and it has a nested (hidden) resolve_arg function.
The function uses the following logic to resolve names:
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]
where cls is a declarative class (derived from Base). As you can see from the code, one way to resolve a name is to use the cls._decl_class_registry structure, given a class Foo, you can resolve the string 'Blah' to a class using Foo._decl_class_registry['Blah'].
The ._decl_class_registry structure is just a python dict; you can also specify your own mapper when creating the Base class:
class_registry = {}
Base = declarative_base(class_registry=class_registry)
and then you can look up classes directly in the class_registry mapping.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With