PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Stockage d'un ARRAY PostgreSQL de valeurs ENUM

Depuis la version 1.3.17, aucune solution de contournement n'est plus nécessaire

La réponse ci-dessous s'est retrouvée dans la documentation sous la forme TABLEAU d'ENUM . Cette page de documentation indique désormais :

Ancienne réponse à des fins historiques :

J'ai regardé Issue 3467 publié par Wichert Akkerman, et cette solution de contournement a été publiée. Crédit à Mike Bayer. Déclarez la classe suivante dans votre code (avec les importations nécessaires, bien sûr) :

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 est maintenant un type de colonne spécial qui est utilisé dans la définition du modèle.

Donc au lieu de

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

Maintenant vous pouvez faire :

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

Maintenant, dans votre code, vous pouvez attribuer des valeurs aux statuses avec une liste et il fera le casting approprié lors de l'enregistrement :

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