sql >> Base de Datos >  >> RDS >> PostgreSQL

Almacenamiento de un ARRAY PostgreSQL de valores ENUM

A partir del 1.3.17, ya no se necesita ninguna solución alternativa

La respuesta a continuación terminó en los documentos como ARRAY de ENUM . Esta página de documentos ahora dice:

Respuesta anterior con fines históricos:

Miré el Problema 3467 publicado por Wichert Akkerman, y esta solución fue publicada. Crédito a Mike Bayer. Declare la siguiente clase en su código (con las importaciones necesarias, por supuesto):

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 ahora es un tipo de columna especial que se usa en la definición del modelo.

Así que en lugar de

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

Ahora puedes hacer:

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

Ahora en su código puede asignar valores a statuses con una lista y hará la conversión adecuada al guardar:

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