sql >> Databasteknik >  >> RDS >> PostgreSQL

Array of Enum i Postgres med SQLAlchemy

Jag hittade en bra lösning i SqlAlchemy-källkoden:

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

Och nu:

achievements = Column(ArrayOfEnum(Enum(AchievementsType)))

Och sedan:

career.achievements = [AchievementsType.world, AchievementsType.local]


  1. Att SHA512-hasha ett lösenord i MySQL-databas av Python

  2. Postgres KOPIERA TILL/FRÅN EN FIL som icke-superanvändare

  3. MySQL - Snabbaste sättet att kontrollera om data i InnoDB-tabellen har ändrats

  4. MySQL - Om det börjar med ett nummer eller specialtecken