Od 1.3.17 nie jest już potrzebne żadne obejście
Poniższa odpowiedź znalazła się w dokumentacji jako ARRAY z ENUM . Ta strona z dokumentami mówi teraz:
Stara odpowiedź w celach historycznych:
Zajrzałem do Problem 3467 wysłane przez Wicherta Akkermana, a to obejście zostało opublikowane. Podziękowania dla Mike'a Bayera. Zadeklaruj następującą klasę w swoim kodzie (oczywiście z niezbędnymi importami):
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
jest teraz specjalnym typem kolumny, który jest używany w definicji modelu.
Więc zamiast
class Judge(db.Model):
statuses = db.Column(ARRAY(status))
Teraz możesz zrobić:
class Judge(db.Model):
statuses = db.Column(ArrayOfEnum(status))
Teraz w swoim kodzie możesz przypisać wartości do statuses
z listą, a po zapisaniu wykona prawidłowe rzutowanie:
my_judge_object.status = ['unmoderated', 'nominee']