我知道有一种方法可以将SQLAlchemy设置prefix
为在所有列前加上公共,是否可以为从单个派生的prefix
所有表名添加公共declarative_base
?
使用declared_attr
和定制Base
的方式:
from sqlalchemy.ext.declarative import declared_attr
class PrefixerBase(Base):
__abstract__ = True
_the_prefix = 'someprefix_'
@declared_attr
def __tablename__(cls):
return cls._the_prefix + cls.__incomplete_tablename__
class SomeModel(PrefixerBase):
__incomplete_tablename__ = 'sometable'
...
Run Code Online (Sandbox Code Playgroud)
标记为的类__abstract__
不会创建表或映射器,并且可以充当扩展声明性基础.
您还可以使用自定义元类(最初在此处描述)使其更加隐式:
from sqlalchemy.ext.declarative.api import DeclarativeMeta
class PrefixerMeta(DeclarativeMeta):
def __init__(cls, name, bases, dict_):
if '__tablename__' in dict_:
cls.__tablename__ = dict_['__tablename__'] = \
'someprefix_' + dict_['__tablename__']
return super().__init__(name, bases, dict_)
Base = declarative_base(metaclass=PrefixerMeta)
class SomeModel(Base):
__tablename__ = 'sometable'
...
Run Code Online (Sandbox Code Playgroud)