PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Speichern eines PostgreSQL ARRAY von ENUM-Werten

Seit 1.3.17 ist keine Problemumgehung mehr erforderlich

Die folgende Antwort landete in den Dokumenten als ARRAY von ENUM . Diese Dokumentseite sagt jetzt:

Alte Antwort für historische Zwecke:

Ich habe mir Ausgabe 3467 angesehen gepostet von Wichert Akkerman, und diese Problemumgehung wurde gepostet. Gutschrift an Mike Bayer. Deklarieren Sie die folgende Klasse in Ihrem Code (natürlich mit den erforderlichen Importen):

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 ist jetzt ein spezieller Spaltentyp, der in der Modelldefinition verwendet wird.

Also statt

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

Jetzt können Sie:

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

Jetzt können Sie in Ihrem Code statuses Werte zuweisen mit einer Liste und es wird beim Speichern das richtige Casting durchführen:

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