28

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

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

4

3 回答 3

49

要添加,您需要: 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')
于 2013-05-23T13:20:40.207 回答
1

注意: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()
于 2021-01-27T10:34:41.843 回答
0

按照 Mario Ruggier 的回答,我尝试将他的示例代码用于我的 MySQL 数据库,但我没有使用架构参数,因为我的数据库没有架构。

我用了:

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

删除唯一约束,并且

op.drop_constraint(constraint_name='uq_user_name', table_name='user', type_='unique')

请注意我使用第三个参数的不同之处type_='unique',因为没有它,MySQL 将返回一条错误消息,说明类似

No generic 'DROP CONSTRAINT' in MySQL - please specify constraint type ...
于 2022-02-15T01:51:26.887 回答