sql >> Databasteknik >  >> RDS >> PostgreSQL

Lagra en PostgreSQL ARRAY med ENUM-värden

Från och med 1.3.17 behövs ingen lösning längre

Svaret nedan hamnade i dokumenten som ARRAY av ENUM . Den här dokumentsidan säger nu:

Gammalt svar för historiska ändamål:

Jag tittade på utgåva 3467 postat av Wichert Akkerman, och denna lösning postades. Tack till Mike Bayer. Deklarera följande klass i din kod (med nödvändiga importer, naturligtvis):

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 är nu en speciell kolumntyp som används i modelldefinitionen.

Så istället för

class Judge(db.Model):
    statuses = db.Column(ARRAY(status))

Nu kan du göra:

class Judge(db.Model):
    statuses = db.Column(ArrayOfEnum(status))

Nu i din kod kan du tilldela värden till statuses med en lista och den kommer att göra rätt casting när du sparar:

my_judge_object.status = ['unmoderated', 'nominee']



  1. Hur bestämmer man språket (engelska, kinesiska...) för en given sträng i Oracle?

  2. SQLite Välj Distinct

  3. Lagra lista med värden (som intressen)

  4. Mysql-åtkomst nekad på grund av användarfel?