【问题标题】:Changing constraint naming conventions in Flask-SQLAlchemy在 Flask-SQLAlchemy 中更改约束命名约定
【发布时间】:2015-03-19 20:04:28
【问题描述】:

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

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

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-17
        • 2021-04-14
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 2017-11-18
        • 1970-01-01
        相关资源
        最近更新 更多