Pla*_*Fan 21 python sqlalchemy metaprogramming metaclass declarative
我们需要创建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'
Run Code Online (Sandbox Code Playgroud)
并动态地将它变成这样的东西:
class MyObject(Base):
__tablename__ = 'my_internal_table_name'
__table_args__ = {'autoload':True}
Run Code Online (Sandbox Code Playgroud)
我们不希望类持续时间超过打开连接,执行查询,然后关闭连接所需的时间.因此,理想情况下,我们可以将上面"存储"变量中的项目放入数据库中,并根据需要提取它们.另一个挑战是对象名称(例如"MyObject")可能在不同的连接上使用,所以我们不能定义它一次并保持它.
关于如何实现这一点的任何建议将不胜感激.
谢谢...
unu*_*tbu 29
您可以MyObject使用3参数调用type动态创建:
type(name, bases, dict)
Return a new type object. This is essentially a dynamic form of the
class statement...
Run Code Online (Sandbox Code Playgroud)
例如:
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}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5702 次 |
| 最近记录: |