Fra 1.3.17 er der ikke længere behov for en løsning
Svaret nedenfor endte i dokumenterne som ARRAY af ENUM . Denne dokumentside siger nu:
Gamle svar til historiske formål:
Jeg så på udgave 3467 indsendt af Wichert Akkerman, og denne work-around blev lagt ud. Kredit til Mike Bayer. Erklær følgende klasse i din kode (med den nødvendige import, selvfølgelig):
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
er nu en speciel kolonnetype, der bliver brugt i modeldefinitionen.
Så i stedet for
class Judge(db.Model):
statuses = db.Column(ARRAY(status))
Nu kan du gøre:
class Judge(db.Model):
statuses = db.Column(ArrayOfEnum(status))
Nu kan du i din kode tildele værdier til statuses
med en liste, og den vil udføre den korrekte casting ved lagring:
my_judge_object.status = ['unmoderated', 'nominee']