在 Flask-SQLAlchemy 中更改约束命名约定

Changing constraint naming conventions in Flask-SQLAlchemy

我想更改 Flask-SQLAlchemy 中设置的标准 naming conventions 约束,以简化使用 Alembic 的迁移。

由于 Flask-SQLAlchemy 自行创建声明性基础(您可以在其中提供命名约定),因此我不确定执行此操作的最佳方法是什么。我可以在创建声明性基础后更改命名约定(即当我创建 Flask-SQLAlchemy 对象时)还是我必须 subclass SQLAlchemy class?有没有完全不同的方式?

2.1 版向扩展引入了 metadata 参数。如果您想要自定义的基本模型只是元数据,您可以将自定义 MetaData 实例传递给它。

db = SQLAlchemy(metadata=MetaData(naming_convention={
    'pk': 'pk_%(table_name)s',
    'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s',
    'ix': 'ix_%(table_name)s_%(column_0_name)s',
    'uq': 'uq_%(table_name)s_%(column_0_name)s',
    'ck': 'ck_%(table_name)s_%(constraint_name)s',
}))

以前,您会子class SQLAlchemy class 并覆盖 make_declarative_base。这仍然有效,并且在您需要进一步自定义基本模型时很有用。

from flask_sqlalchemy import SQLAlchemy as BaseSQLAlchemy, Model, _BoundDeclarativeMeta, _QueryProperty
from sqlalchemy import MetaData

class SQLAlchemy(BaseSQLAlchemy):
    def make_declarative_base(self):
        metadata = MetaData(naming_convention={
            'pk': 'pk_%(table_name)s',
            'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s',
            'ix': 'ix_%(table_name)s_%(column_0_name)s',
            'uq': 'uq_%(table_name)s_%(column_0_name)s',
            'ck': 'ck_%(table_name)s_%(constraint_name)s',
        })
        base = declarative_base(metadata=metadata, cls=Model, name='Model', metaclass=_BoundDeclarativeMeta)
        base.query = _QueryProperty(self)
        return base

从 Flask-SQLAlchemy 2.1 开始,您可以执行以下操作:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import MetaData

metadata = MetaData(
  naming_convention={
    'pk': 'pk_%(table_name)s',
    'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s',
    'ix': 'ix_%(table_name)s_%(column_0_name)s',
    'uq': 'uq_%(table_name)s_%(column_0_name)s',
    'ck': 'ck_%(table_name)s_%(constraint_name)s',
    }
)
db = SQLAlchemy(metadata=metadata)