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']