小编典典

SQLAlchemy中的动态类创建

python

我们需要创建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”)可能会用在不同的连接上,因此我们不能一次定义它并保持它不变。

任何有关如何实现此目标的建议将不胜感激。

谢谢…


阅读 212

收藏
2020-12-20

共1个答案

小编典典

您可以MyObject使用3个参数的调用来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}
2020-12-20