2013-05-16 57 views
13

我有一個'測試'有一個'名稱'列沒有約束。我需要更改通過給它'唯一'的約束。我應該怎麼做?Alembic:如何添加唯一約束到現有的列

我應該使用op.alter_column('???')還是create_unique_constraint('???')? 新列不是create_unique_constraint,而不是現有的列?

回答

21

要添加,你需要: 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

充分利用這些鏈接拒絕的權限的文檔文件。答案應該包含代碼示例,而不是直接指向鏈接(儘管您可能想引用它們在底部或「瞭解更多」) – Alvaro

+1

鏈接已斷開。無論如何,我認爲這不會是一個長時間的答案,所以我想它本身應該已經被回答了。鏈接到文檔將是一個加號爲 –

+2

未來的讀者的例子代碼是: 'from alembic import op' create - 'op.create_unique_constraint(「uq_user_name」,「user」,[「name」])' drop - 'op.drop_constraint('uq_user_name','user')' – idog

-1

由於以前的答案的鏈接沒有更長的工作,這裏是一個工作的答案:

 
"""Make domain column unique 

Revision ID: 9cb14e885b40 
Revises: 76c9f6e094e2 
Create Date: 2016-07-14 15:54:19.300574 

""" 

# revision identifiers, used by Alembic. 
revision = '9cb14e885b40' 
down_revision = '76c9f6e094e2' 
branch_labels = None 
depends_on = None 

from alembic import op 
import sqlalchemy as sa 


def upgrade(): 
    # Applies a unique constraint on the 'instances' table for the column 'domain' 
    op.create_index('instances_domain_unique', 'instances', ['domain'], unique=True) 

def downgrade(): 
    # drops the unique constraint named 'instances_domain_unique' 
    op.drop_index('instances_domain_unique') 

關於op.create_index

關於op.drop_index

+0

可以應用約束而不丟棄和重新創建像這樣的索引。 –