python sqlalchemy alembic

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 :-).