SQLAlchemy 动态更改声明表名

Kib*_*our 5 python sqlalchemy

我有一个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)

    我究竟做错了什么?