我想更改在Flask中设置的约束的标准命名约定,以简化使用Alembic的迁移。
当自己创建声明基(您可以在其中提供命名约定)时,我不确定这样做的最佳方法是什么。我是否可以在创建声明基之后更改命名约定(即,当我创建了对象时),还是必须对SQLAlchemy类进行子类化?有完全不同的方式吗?
发布于 2015-03-19 20:06:07
Version2.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发布于 2016-02-23 18:48:57
从Flask到SQLAlchemy2.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)https://stackoverflow.com/questions/29153930
复制相似问题