python - Alambique: IntegrityError: "columna contiene valores nulos" al agregar una columna que no admite nulos
alembic python (2)
Estoy agregando una columna a una tabla existente. Esta nueva columna es nullable=False
.
op.add_column(''mytable'', sa.Column(''mycolumn'', sa.String(), nullable=False))
Cuando ejecuto la migración, se queja:
sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
Es porque sus datos existentes no tienen ningún valor en esa nueva columna, es decir, null
. Por lo tanto, causando dicho error. Al agregar una columna que no admite nulos, debe decidir qué valor otorgar a los datos ya existentes
De acuerdo, los datos existentes solo deberían tener "lorem ipsum" para esta nueva columna. ¿Pero cómo lo hago? No puedo ACTUALIZAR porque la columna aún no está allí.
Use el server_default
arg:
op.add_column(''mytable'', sa.Column(
''mycolumn'',
sa.String(),
nullable=False,
server_default=''lorem ipsum'', # <--- add this
))
Pero, pero, no quiero que tenga valor predeterminado
Suelta luego usando op.alter_column(''mytable'', ''mycolumn'', server_default=None)
Por ejemplo, su función de upgrade()
sería:
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)
Una alternativa a la respuesta de @ Ron es hacer lo contrario y modificar los datos antes de agregar la restricción:
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)
Parece más limpio y más poderoso para mí, pero estás escribiendo SQL :-).