fix mv index creation order

This commit is contained in:
Robert Lechte 2020-11-13 12:25:24 +11:00
parent 84e46bf481
commit a0b580eb14
4 changed files with 45 additions and 3 deletions

View File

@ -3,6 +3,8 @@ from __future__ import unicode_literals
from collections import OrderedDict as od
from functools import partial
import schemainspect
from .statements import Statements
from .util import differences
@ -602,6 +604,32 @@ class Changes(object):
self.i_target.enums,
)
@property
def mv_indexes(self):
a = self.i_from.indexes.items()
b = self.i_target.indexes.items()
def is_mv_index(i, ii):
sig = schemainspect.misc.quoted_identifier(i.table_name, i.schema)
return sig in ii.materialized_views
a_od = od((k, v) for k, v in a if is_mv_index(v, self.i_from))
b_od = od((k, v) for k, v in b if is_mv_index(v, self.i_target))
return partial(statements_for_changes, a_od, b_od)
@property
def non_mv_indexes(self):
a = self.i_from.indexes.items()
b = self.i_target.indexes.items()
def is_mv_index(i, ii):
sig = schemainspect.misc.quoted_identifier(i.table_name, i.schema)
return sig in ii.materialized_views
a_od = od((k, v) for k, v in a if not is_mv_index(v, self.i_from))
b_od = od((k, v) for k, v in b if not is_mv_index(v, self.i_target))
return partial(statements_for_changes, a_od, b_od)
@property
def sequences(self):
return partial(

View File

@ -88,21 +88,23 @@ class Migration(object):
self.add(self.changes.privileges(drops_only=True))
self.add(self.changes.non_pk_constraints(drops_only=True))
self.add(self.changes.mv_indexes(drops_only=True))
self.add(self.changes.non_table_selectable_drops())
self.add(self.changes.pk_constraints(drops_only=True))
self.add(self.changes.indexes(drops_only=True))
self.add(self.changes.non_mv_indexes(drops_only=True))
self.add(self.changes.tables_only_selectables())
self.add(self.changes.sequences(drops_only=True))
self.add(self.changes.enums(drops_only=True, modifications=False))
self.add(self.changes.extensions(drops_only=True, modifications=False))
self.add(self.changes.indexes(creations_only=True))
self.add(self.changes.non_mv_indexes(creations_only=True))
self.add(self.changes.pk_constraints(creations_only=True))
self.add(self.changes.non_pk_constraints(creations_only=True))
self.add(self.changes.non_table_selectable_creations())
self.add(self.changes.mv_indexes(creations_only=True))
if privileges:
self.add(self.changes.privileges(creations_only=True))

View File

@ -8,3 +8,8 @@ create view v as
select id, a, max(b)
from t
group by id; -- "a" is implied because "id" is primary key
create materialized view mv as select id from v;
create unique index on mv (id);

View File

@ -15,4 +15,11 @@ create or replace view "public"."v" as SELECT t.id,
t.a,
max(t.b) AS max
FROM t
GROUP BY t.id;
GROUP BY t.id;
create materialized view "public"."mv" as SELECT v.id
FROM v;
CREATE UNIQUE INDEX mv_id_idx ON public.mv USING btree (id);