Python 更改Alchemy中的约束命名约定

Python 更改Alchemy中的约束命名约定,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我想更改SQLAlchemy中设置的约束标准,以简化Alembic的迁移 由于Flask SQLAlchemy本身创建了声明性基础(您可以在其中提供命名约定),我不确定这样做的最佳方式是什么。在创建声明性基之后(即,当我创建Flask SQLAlchemy对象时),我是否可以更改命名约定,或者我是否必须对SQLAlchemy类进行子类化?有完全不同的方法吗?版本2.1在扩展中引入了元数据参数。如果您只想自定义基本模型的元数据,则可以向其传递一个自定义元数据实例 db = SQLAlchemy(m

我想更改SQLAlchemy中设置的约束标准,以简化Alembic的迁移


由于Flask SQLAlchemy本身创建了声明性基础(您可以在其中提供命名约定),我不确定这样做的最佳方式是什么。在创建声明性基之后(即,当我创建Flask SQLAlchemy对象时),我是否可以更改命名约定,或者我是否必须对SQLAlchemy类进行子类化?有完全不同的方法吗?

版本2.1在扩展中引入了
元数据
参数。如果您只想自定义基本模型的元数据,则可以向其传递一个自定义
元数据
实例

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',
}))

以前,您将对
SQLAlchemy
类进行子类化,并重写
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

从Alchemy 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)