Alembic: IntegrityError: "столбец содержит пустые значения" при добавлении столбца с нулевым значением
Я добавляю столбец в существующую таблицу. Этот новый столбец nullable=False
.
op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
Когда я запускаю миграцию, он жалуется:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
Ответы
Ответ 1
Это потому, что ваши существующие данные не имеют значения в этом новом столбце, то есть null
. Таким образом вызывая указанную ошибку. При добавлении необнуляемого столбца вы должны решить, какое значение дать уже существующим данным
Хорошо, у существующих данных должен быть просто "lorem ipsum" для этого нового столбца. Но как мне это сделать? Я не могу обновить, потому что столбец еще не там.
Используйте server_default
:
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)
его, используя 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)
Ответ 2
Альтернативой @Ron ответом является сделать обратное и изменить данные до, добавив ограничение:
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: -).
Ответ 3
Он справедливо сообщает вам, что в базе данных для этого столбца существуют (или будут) значения NULL. Ответ состоит в том, чтобы отредактировать файл миграции, чтобы обновить столбец перед изменением определения столбца:
from sqlalchemy.sql import table, column
def upgrade():
op.add_column('role', sa.Column('role_name', sa.String(length=30), nullable=True))
role = table('role', column('role_name'))
op.execute(role.update().values(role_name=''))
op.alter_column('role', 'role_name', nullable=False)