djrobstep / migra

Like diff but for PostgreSQL schemas

Home Page:https://databaseci.com/docs/migra

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Changing a "GENERATED" column to regular non-generated one causes the whole column to DROP

hi2u opened this issue · comments

commented

If you initially have a GENERATED column, and then later on remove the GENERATED part so that it's now just a regular column... rather than just removing the GENERATED part, migra DROPs the whole column and re-creates it.

Which means you lose all your data in that column.

Example is below:

Old schema:

CREATE TABLE "demo_gencol" (
            "id" UUID           PRIMARY KEY     DEFAULT uuid_generate_v4(), -- PRIMARY KEY
    "the_column" TEXT               NULL GENERATED ALWAYS AS ('the original generated value') STORED -- The column that is originally GENERATED, then changed not to be
);

New schema:

CREATE TABLE "demo_gencol" (
            "id" UUID           PRIMARY KEY     DEFAULT uuid_generate_v4(), -- PRIMARY KEY
    "the_column" TEXT               NULL -- The column that is originally GENERATED, then changed not to be
);

❌ Migra currently generates diff:

alter table "demo_gencol" drop column "the_column";

alter table "demo_gencol" add column "the_column" text;

...this was on version numbers:

pip3 list --format=columns | grep -iE "migra|psycopg|schemainspect"
migra               3.0.1652017683
psycopg2            2.8.6
psycopg2-binary     2.9.3
schemainspect       3.1.1652015119

✔️ Migra should instead generate diff:

ALTER TABLE "demo_gencol" ALTER COLUMN "the_column" DROP EXPRESSION;

This will simply remove the GENERATED feature from the column, and retain your data that was previously populated by it.

Thanks for filing this. Added support for this as of the latest release.