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

Memorizzazione di un ARRAY PostgreSQL di valori ENUM

A partire dalla 1.3.17, non è più necessaria alcuna soluzione alternativa

La risposta di seguito è finita nei documenti come ARRAY di ENUM . Questa pagina dei documenti ora dice:

Vecchia risposta per scopi storici:

Ho esaminato Numero 3467 pubblicato da Wichert Akkerman e questa soluzione è stata pubblicata. Ringraziamo Mike Bayer. Dichiara la seguente classe nel tuo codice (con le importazioni necessarie, ovviamente):

from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy import cast

class ArrayOfEnum(ARRAY):
    def bind_expression(self, bindvalue):
        return cast(bindvalue, self)

    def result_processor(self, dialect, coltype):
        super_rp = super(ArrayOfEnum, self).result_processor(dialect, coltype)

        def handle_raw_string(value):
            if value==None:
                return []
            inner = re.match(r"^{(.*)}$", value).group(1)
            return inner.split(",")

        def process(value):
            return super_rp(handle_raw_string(value))
        return process

ArrayOfEnum è ora un tipo di colonna speciale che viene utilizzato nella definizione del modello.

Quindi invece di

class Judge(db.Model):
    statuses = db.Column(ARRAY(status))

Ora puoi fare:

class Judge(db.Model):
    statuses = db.Column(ArrayOfEnum(status))

Ora nel tuo codice puoi assegnare valori a statuses con un elenco ed eseguirà il casting corretto al salvataggio:

my_judge_object.status = ['unmoderated', 'nominee']