sql >> Databáze >  >> RDS >> PostgreSQL

Ukládání PostgreSQL ARRAY hodnot ENUM

Od 1.3.17 již není potřeba žádné řešení

Odpověď níže skončila v dokumentech jako POLE ENUM . Tato stránka dokumentů nyní říká:

Stará odpověď pro historické účely:

Podíval jsem se na Vydání 3467 zveřejnil Wichert Akkerman a toto řešení bylo zveřejněno. Poděkování patří Miku Bayerovi. Deklarujte ve svém kódu následující třídu (samozřejmě s nezbytnými importy):

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 je nyní speciální typ sloupce, který se používá v definici modelu.

Takže místo

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

Nyní můžete:

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

Nyní můžete ve svém kódu přiřadit hodnoty statuses se seznamem a po uložení provede správný casting:

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



  1. Jak automatizovat selhání databáze pomocí ClusterControl

  2. sql triggery Mám chybu při ukládání názvu sloupce do proměnné a používám jej pro OLD.myvar v sql triggerech

  3. Nejsou uživatelé 'User'@'%' a 'User'@'localhost' stejní?

  4. SQL Server Výstupní klauzule do skalární proměnné