【问题标题】:Alembic: How to add unique constraint to existing columnAlembic:如何向现有列添加唯一约束
【发布时间】:2013-05-11 10:58:34
【问题描述】:

我有一个表 'test' 有一个没有约束的列 'Name'。我需要通过给它一个UNIQUE 约束来ALTER 这个列。我该怎么做?

我应该使用op.alter_column('???') 还是create_unique_constraint('???')? 不是 create_unique_constraint 用于新列而不是现有列吗?

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy alembic


    【解决方案1】:

    要添加,您需要: https://alembic.sqlalchemy.org/en/latest/ops.html#alembic.operations.Operations.create_unique_constraint

    from alembic import op
    op.create_unique_constraint('uq_user_name', 'user', ['name'], schema='my_schema')
    

    要放弃,您需要: https://alembic.sqlalchemy.org/en/latest/ops.html#alembic.operations.Operations.drop_constraint

    op.drop_constraint('uq_user_name', 'user', schema='my_schema')
    

    【讨论】:

      【解决方案2】:

      注意:SQLAlchemy 迁移

      更新 = 版本:0.7.3

      1. 在 UniqueConstraint 上使用 create() 添加唯一约束
      2. 要删除唯一约束,请在 UniqueConstraint 上使用 drop()

      创建一个迁移脚本。可以通过 2 种方式创建脚本。

      # create manage.py
      migrate manage manage.py --repository=migrations --url=postgresql://<user>:<password>@localhost:5432/<db_name>
      # create script file
      python manage.py script "Add Unique Contraints"
      

      或者,如果您不想创建 manage.py,请使用以下命令

      migrate script --repository=migrations --url=postgresql://<user>:<password?@localhost:5432/<db_name> "Add Unique Contraint"
      

      它将创建 00x_Add_Unique_Constraints.py

      文件:00x_Add_Unique_Constraints.py

      from migrate import UniqueConstraint
      from sqlalchemy import MetaData, Table
      
      
      def upgrade(migrate_engine):
          # Upgrade operations go here. Don't create your own engine; bind
          # migrate_engine to your metadata
          # Table Name: user_table
          # Column Name: first_name
      
          metadata = MetaData(bind=migrate_engine)
          user_table = Table('user_table', metadata, autoload=True)
          UniqueConstraint(user_table.c.first_name, table=user_table).create() 
      
      
      def downgrade(migrate_engine):
          # Operations to reverse the above upgrade go here.
          # Table Name: user_table
          # Column Name: first_name
      
          metadata = MetaData(bind=migrate_engine)
          user_table = Table('user_table', metadata, autoload=True)
          UniqueConstraint(user_table.c.first_name, table=user_table).drop()
      

      【讨论】:

        猜你喜欢
        • 2016-08-22
        • 2018-02-20
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2021-05-09
        • 1970-01-01
        • 2021-04-01
        相关资源
        最近更新 更多