Python SQLAlchemy中的动态类创建

Python SQLAlchemy中的动态类创建,python,sqlalchemy,metaprogramming,metaclass,declarative,Python,Sqlalchemy,Metaprogramming,Metaclass,Declarative,我们需要创建SQLAlchemy类来访问多个外部数据源,这些数据源的数量会随着时间的推移而增加。我们的核心ORM模型使用声明性基础,我知道我们可以使用autoload=True手动指定新的ORM类来自动生成映射 问题是,我们需要能够动态生成它们,采用如下方式: from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() stored={} stored['tablename']='my_in

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

例如:

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}
mydict={'''tablename'':存储['tablename'],
“_表_参数:{'autoload':True},}”
MyObj=type(存储的['objectname'],(基,),mydict)
印刷品(MyObj)
# 
打印(MyObj.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu)
# 
打印(MyObj.\uuuuu表格名\uuuuuuuu)
#我的\u内部\u表\u名称
打印(MyObj.\uuuuu表格\uuu参数\uuuuuuuuuuuuuu)
#{'autoload':True}

男孩……我觉得自己很笨。这是一个简单的解决方案。我没有意识到类型方法如此强大。我稍微修改了解决方案,将对象名放在全局空间中,这样它就可以直接包含在SQLAlchemy查询中:globals()[存储的['objectname']]=type(存储的['objectname'],(Base,),mydict)谢谢…这是一个很好的解决方案。不要觉得自己很笨!我通过观看其他人在这里使用它来学习这个技巧。现在你也知道了诀窍,可以让你的朋友们大吃一惊了。:)@unutbu您是否需要额外的分离COMA以便调用类型意识到它们只是第一个参数?此线程有点旧,但是,我在任何地方都找不到解决方案,如何在api调用期间在其他地方重用MyObj?因为如果我调用工厂两次,就会抛出一个错误,说tablename已经存在
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}