我有一个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)
我究竟做错了什么?