sql >> Database teknologi >  >> RDS >> PostgreSQL

Lagring af en PostgreSQL ARRAY af ENUM-værdier

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']



  1. Sikker mod SQL Injection - PDO, mysqli

  2. Strengsorteringsrækkefølge (LC_COLLATE og LC_CTYPE)

  3. Anbefalede Intel-processorer til SQL Server 2014-arbejdsbelastninger

  4. Hvordan kan jeg vise et billede fra SQL Server ved hjælp af ASP.NET?