我们需要创建SQLAlchemy类来访问多个外部数据源,这些数据源会随着时间的推移而增加。我们为核心ORM模型使用了声明式基础,并且我知道我们可以使用autoload = True手动指定新的ORM类,以自动生成映射。
问题是我们需要能够采用以下方式动态生成它们:
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() stored={} stored['tablename']='my_internal_table_name' stored['objectname']='MyObject'
并动态地将其转换为如下所示:
class MyObject(Base): __tablename__ = 'my_internal_table_name' __table_args__ = {'autoload':True}
我们不希望类的持久时间长于打开连接,执行查询然后关闭连接所需的时间。因此,理想情况下,我们可以将上面“存储”变量中的项目放入数据库中,并根据需要将其提取。另一个挑战是对象名称(例如“ MyObject”)可能会用在不同的连接上,因此我们不能一次定义它并保持它不变。
任何有关如何实现此目标的建议将不胜感激。
谢谢…
您可以MyObject使用3个参数的调用来type动态创建:
MyObject
type
type(name, bases, dict) Return a new type object. This is essentially a dynamic form of the class statement...
例如:
mydict={'__tablename__':stored['tablename'], '__table_args__':{'autoload':True},} MyObj=type(stored['objectname'],(Base,),mydict) print(MyObj) # <class '__main__.MyObject'> print(MyObj.__base__) # <class '__main__.Base'> print(MyObj.__tablename__) # my_internal_table_name print(MyObj.__table_args__) # {'autoload': True}