我想更改Flask-SQLAlchemy中设置的标准naming conventions,以简化使用Alembic的迁移。
由于Flask-SQLAlchemy自己创建了声明性基础(你可以提供命名约定),我不确定这样做的最佳方法是什么。我可以在创建声明性基础之后更改命名约定(即,当我创建了Flask-SQLAlchemy对象时)或者我是否必须继承SQLAlchemy类?有完全不同的方式吗?
答案 0 :(得分:13)
版本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',
}))
以前,您可以继承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
答案 1 :(得分:4)
从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)