如何在SQLAlchemy中为所有表设置公共前缀

can*_*nni 4 python sqlalchemy

我知道有一种方法可以将SQLAlchemy设置prefix为在所有列前加上公共,是否可以为从单个派生的prefix所有表名添加公共declarative_base

Ilj*_*ilä 6

使用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)