在 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)
我想更改 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)