indexdef
todavía no es exactamente lo mismo que la declaración de creación en el caso de un índice parcial. Por ejemplo, si creamos un índice con la siguiente declaración:
CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');
postgres generará el siguiente indexdef:
CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))
Aunque postgres indexdef tiene todos los tipos inferidos y probablemente sea mejor, nuestro ORM está comparando la cláusula where de los dos índices y cree que es diferente cuando generamos scripts de migración. Lo cual es un problema para nosotros.
CONCURRENTLY
alCREATE INDEX
comando, para no tener un bloqueo exclusivo en la tabla.