sql >> Database >  >> RDS >> PostgreSQL

Een PostgreSQL-ARRAY van ENUM-waarden opslaan

Vanaf 1.3.17 is er geen tijdelijke oplossing meer nodig

Het onderstaande antwoord kwam in de documenten terecht als ARRAY van ENUM . Deze documentenpagina zegt nu:

Oud antwoord voor historische doeleinden:

Ik heb gekeken naar Issue 3467 gepost door Wichert Akkerman, en deze work-around is geplaatst. Met dank aan Mike Bayer. Declareer de volgende klasse in je code (met de nodige invoer natuurlijk):

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 is nu een speciaal kolomtype dat wordt gebruikt in de modeldefinitie.

Dus in plaats van

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

Nu kunt u het volgende doen:

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

Nu kunt u in uw code waarden toewijzen aan statuses met een lijst en het zal de juiste casting doen bij het opslaan:

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



  1. Tabellen en problemen maken met de primaire sleutel in Rails

  2. Verwijderknop werkt niet in CodeIgniter

  3. Een reeks maken voor een varchar2-veld in Oracle

  4. Formulier niet opslaan in database