SQLAlchemy中的动态类创建

28 投票
1 回答
8879 浏览
提问于 2025-04-15 22:21

我们需要创建一些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}

我们不希望这些类存在的时间超过必要的时间,只需要在打开连接、执行查询后再关闭连接。因此,理想情况下,我们可以把上面“stored”变量中的内容存入数据库,并在需要时提取出来。另一个挑战是,像“我的对象”(MyObject)这样的对象名称可能会在不同的连接中使用,所以我们不能只定义一次然后一直保留它。

如果有任何建议可以帮助实现这个目标,我们将非常感激。

谢谢...

1 个回答

35

你可以通过使用 type 的三参数调用,动态地创建 MyObject

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}

撰写回答