drop-and-recreate defaults on enum modification (#125)

This commit is contained in:
djrobstep 2020-04-09 22:11:47 +10:00 committed by GitHub
parent 26dbccaa06
commit 64ef4a4463
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 40 additions and 1 deletions

View File

@ -130,18 +130,29 @@ def get_enum_modifications(tables_from, tables_target, enums_from, enums_target)
recreate = Statements()
post = Statements()
enums_to_change = e_modified
for t, v in t_modified.items():
t_before = tables_from[t]
_, _, c_modified, _ = differences(t_before.columns, v.columns)
for k, c in c_modified.items():
before = t_before.columns[k]
if (
c.is_enum == before.is_enum
and c.dbtypestr == before.dbtypestr
and c.enum != before.enum
):
has_default = c.default and not c.is_generated
if has_default:
pre.append(before.drop_default_statement(t))
pre.append(before.change_enum_to_string_statement(t))
post.append(before.change_string_to_enum_statement(t))
if has_default:
post.append(before.add_default_statement(t))
for e in enums_to_change.values():
recreate.append(e.drop_statement)
recreate.append(e.create_statement)

View File

@ -14,7 +14,7 @@ python = "*"
sqlbag = "*"
six = "*"
# schemainspect = {path="../schemainspect"}
schemainspect = ">=0.1.1585871494"
schemainspect = ">=0.1.1586428725"
psycopg2-binary = { version="*", optional = true }
[tool.poetry.dev-dependencies]

View File

@ -0,0 +1,6 @@
create type order_status as enum('pending', 'processing', 'complete');
create table orders(
id serial primary key,
status order_status default 'pending'::order_status
);

View File

@ -0,0 +1,6 @@
create type order_status as enum('pending', 'processing', 'complete', 'rejected');
create table orders(
id serial primary key,
status order_status default 'pending'::order_status
)

View File

@ -0,0 +1,11 @@
alter table "public"."orders" alter column "status" drop default;
alter table "public"."orders" alter column "status" set data type varchar using "status"::varchar;
drop type "public"."order_status";
create type "public"."order_status" as enum ('pending', 'processing', 'complete', 'rejected');
alter table "public"."orders" alter column "status" set data type order_status using "status"::order_status;
alter table "public"."orders" alter column "status" set default 'pending'::order_status;

View File

@ -84,6 +84,11 @@ def test_privs():
do_fixture_test(FIXTURE_NAME, with_privileges=True)
def test_enumdefaults():
for FIXTURE_NAME in ["enumdefaults"]:
do_fixture_test(FIXTURE_NAME, with_privileges=True)
schemainspect_test_role = "schemainspect_test_role"