我有一个表 'test' 有一个没有约束的列 'Name'。我需要给ALTER
这个专栏一个UNIQUE
约束。我该怎么做?
我应该使用op.alter_column('???')
orcreate_unique_constraint('???')
吗?不是 create_unique_constraint 用于新列而不是现有列吗?
我有一个表 'test' 有一个没有约束的列 'Name'。我需要给ALTER
这个专栏一个UNIQUE
约束。我该怎么做?
我应该使用op.alter_column('???')
orcreate_unique_constraint('???')
吗?不是 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')
注意:SQLAlchemy 迁移
更新 = 版本:0.7.3
创建迁移脚本。可以通过 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()
按照 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 ...