我正在向現有表中添加一列。這個新列是nullable=False
。Alembic:IntegrityError:「列包含空值」時添加不可空列
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
當我運行遷移,它抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
我正在向現有表中添加一列。這個新列是nullable=False
。Alembic:IntegrityError:「列包含空值」時添加不可空列
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
當我運行遷移,它抱怨:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
這是因爲現有數據對新列沒有值,即null
。從而導致所述錯誤。當添加非空列,你必須決定什麼樣的價值給已經存在的數據
好吧,現有的數據應該只是有「Lorem存有」這個新列呢。但我該怎麼做?我無法更新,因爲該列尚未存在。
使用server_default
ARG:
op.add_column('mytable', sa.Column(
'mycolumn',
sa.String(),
nullable=False,
server_default='lorem ipsum', # <--- add this
))
可是,可是,我不希望它有默認值
放下它後使用op.alter_column('mytable', 'mycolumn', server_default=None)
例如您upgrade()
職能是:
def upgrade():
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False, server_default='lorem ipsum'))
op.alter_column('mytable', 'mycolumn', server_default=None)
到@羅恩的回答是做相反,修改數據之前添加約束的選擇:
def upgrade():
op.add_column('my_table', sa.Column('my_column', sa.String()))
op.execute('UPDATE my_table SET my_column=my_other_column')
op.alter_column('my_table', 'my_column', nullable=False)
似乎更清潔,更強大,我,但是你正在寫SQL :-)。
當使用MySQL後端時,最後一行應該是op.alter_column('my_table','my_column',existing_type = sa.String(),nullable = False),否則你會得到一個alembic.util.exc.CommandError(更多關於[這裏](http://alembic.zzzcomputing.com/en/latest/ops.html#alembic.operations.Operations.alter_column)) –
它仍然不適用於Postgres數據庫。 –