Подтвердить что ты не робот

Alembic: IntegrityError: "столбец содержит пустые значения" при добавлении столбца с нулевым значением

Я добавляю столбец в существующую таблицу. Этот новый столбец nullable=False.

op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))

Когда я запускаю миграцию, он жалуется:

sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
4b9b3361

Ответ 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)