PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Armazenando um ARRAY PostgreSQL de valores ENUM

A partir da versão 1.3.17, nenhuma solução alternativa é mais necessária


A resposta abaixo acabou nos documentos como ARRAY de ENUM . Esta página de documentos agora diz:

Resposta antiga para fins históricos:


Analisei o Problema 3467 postado por Wichert Akkerman, e esta solução alternativa foi postada. Crédito para Mike Bayer. Declare a seguinte classe em seu código (com as importações necessárias, é claro):
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 agora é um tipo de coluna especial que é usado na definição do modelo.

Então, em vez de
class Judge(db.Model):
    statuses = db.Column(ARRAY(status))

Agora você pode fazer:
class Judge(db.Model):
    statuses = db.Column(ArrayOfEnum(status))

Agora em seu código você pode atribuir valores a statuses com uma lista e fará a conversão adequada ao salvar:
my_judge_object.status = ['unmoderated', 'nominee']