Alembic:如何向现有列添加唯一约束

时间:2013-05-16 13:52:17

标签: sqlalchemy flask-sqlalchemy alembic

我有一个表'test',其列'Name'没有约束。我需要通过ALTER约束来UNIQUE这个列。我该怎么办?

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

2 个答案:

答案 0 :(得分:29)

要添加,您需要: http://alembic.zzzcomputing.com/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')

要放弃,你需要: http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.drop_constraint

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

答案 1 :(得分:1)

注意:SQLAlchemy 迁移

更新 = 版本:0.7.3

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

创建迁移脚本。可以通过两种方式创建脚本。

# 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()