如何解决Alembic MSSQL 唯一约束允许空值
要解决的问题
问题
-
将两行数据添加到允许空值的列中,如下面的实现中的唯一约束会给出以下错误:
Violation of UNIQUE KEY constraint 'UQ_...'. Cannot insert duplicate key in object 'TABLE'. The duplicate key value is (<NULL>). (2627) (sqlExecDirectW)"
当前实施
alembic 操作是:
from alembic import op
import sqlalchemy as sa
#...
def upgrade():
op.add_column(
'TABLE',sa.Column('reference',sa.Integer(),nullable=True,unique=True),)
def downgrade():
op.drop_column('TABLE','reference')
解决方法
在唯一字段中允许空值的解决方案是:
- 定义列时不要创建唯一约束
op.add_column(
'TABLE',sa.Column('reference',sa.Integer(),nullable=True),# No unique=True
)
- 手动创建一个 unique index
op.create_index(
'uq_reference_allow_nulls',table_name='TABLE',columns=['reference'],mssql_where=sa.text('reference IS NOT NULL'),unique=True,)
- 降级时删除索引。
op.drop_index('uq_reference_allow_nulls',table_name='TABLE')
这也解决了由于删除了 unique
参数而对表具有随机唯一约束的问题。总的来说,alembic 修订版如下所示:
from alembic import op
import sqlalchemy as sa
#...
def upgrade():
op.add_column(
'TABLE',# Do not include unique here
)
op.create_index(
'uq_reference_allow_nulls',)
def downgrade():
op.drop_index('uq_reference_allow_nulls',table_name='TABLE')
op.drop_column('TABLE','reference')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。