Array of Enum in Postgres with SQLAlchemy
I found nice workaround in SqlAlchemy source code:
import re
from sqlalchemy import TypeDecorator, cast
from sqlalchemy.dialects.postgresql import ARRAY
class ArrayOfEnum(TypeDecorator):
impl = 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):
inner = re.match(r"^{(.*)}$", value).group(1)
return inner.split(",") if inner else []
def process(value):
if value is None:
return None
return super_rp(handle_raw_string(value))
return process
And now:
achievements = Column(ArrayOfEnum(Enum(AchievementsType)))
And then:
career.achievements = [AchievementsType.world, AchievementsType.local]