我们需要创建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")可能在不同的连接上使用,所以我们不能定义它一次并保持它.
关于如何实现这一点的任何建议将不胜感激.
谢谢...
我有一个models定义声明表的模块,例如:
from sqlalchemy import Column, Integer
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class MyTable(Base):
__tablename__ = 'T_FOO'
__table_args__ = {'schema': 'BAR'}
id = Column('ID', Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
现在,我想动态改变只表名和/或架构名称。但是为了代码的清晰性,我还想保留上面的声明性模型。
按照这个答案,我试过了
MyTable.__table_args__['schema'] = 'TAZ'
type(MyTable.__mapper__.class_.__name__, MyTable.__bases__, dict(MyTable.__dict__))
Run Code Online (Sandbox Code Playgroud)
但这会导致AssertionError堆栈跟踪(sqlalchemyv1.0.9):
Traceback (most recent call last):
[...]
File "[...]\sqlalchemy\orm\mapper.py", line 625, in __init__
self._configure_class_instrumentation()
File "[...]\sqlalchemy\orm\mapper.py", line 1113, in _configure_class_instrumentation
assert manager.class_ is self.class_
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?