PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Django/PostgreSQL da varchar a UUID

type uuid nell'istruzione DDL è l'abbreviazione di SET DATA TYPE uuid . Il manuale:

varchar_pattern_ops è una classe operatore che verrebbe menzionato nel tuo messaggio di errore se hai uuid utilizzando questa classe operatore in qualsiasi indice. In genere per consentire un ordinamento, una corrispondenza dei modelli e condizioni di intervallo più rapidi.

Per risolvere il problema, elimina gli indici in conflitto, modifica il tipo di dati e quindi ricrea gli indici senza la classe dell'operatore speciale - if ne hai ancora bisogno.

Tuttavia, alcune query tipiche che farebbero uso di un varchar_pattern_ops index smetterebbe di funzionare con il tipo di dati uuid invece di varchar . Come la corrispondenza dei modelli:

Assicurati di correggere anche eventuali domande di questo tipo.

@fl0cke ha sottolineato una risposta correlata:

Suggerisco un percorso leggermente diverso. È più economico eliminare l'indice, modificare il tipo di dati e poi crea un nuovo indice, se è ancora utile.

DROP INDEX tbl_guid_varchar_pattern_ops_idx;

ALTER TABLE tbl ALTER COLUMN guid TYPE uuid USING guid::uuid;

CREATE INDEX tbl_guid_idx ON tbl (guid);

Come trovare l'indice offensivo?

Nelle versioni moderne di Postgres ottieni gli indici esistenti per la tabella con \d tbl in psql.

Per ottenere tutto completare CREATE INDEX istruzioni per la tabella data:

SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM   pg_index
WHERE  indrelid = 'public.tbl'::regclass;  -- optionally schema-qualified

Per ottenere solo quelli usando varchar_pattern_ops :

SELECT pg_get_indexdef(i.indexrelid) || ';' AS idx
FROM   pg_index i
JOIN   pg_opclass o ON o.oid = ANY (i.indclass)
WHERE  i.indrelid = 'public.big'::regclass
AND    o.opcname = 'varchar_pattern_ops';

Dettagli: