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

时间:2015-03-19 20:04:29

标签: python flask sqlalchemy flask-sqlalchemy

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

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

2 个答案:

答案 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)