PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przechowywanie tablicy PostgreSQL zawierającej wartości ENUM

Od 1.3.17 nie jest już potrzebne żadne obejście

Poniższa odpowiedź znalazła się w dokumentacji jako ARRAY z ENUM . Ta strona z dokumentami mówi teraz:

Stara odpowiedź w celach historycznych:

Zajrzałem do Problem 3467 wysłane przez Wicherta Akkermana, a to obejście zostało opublikowane. Podziękowania dla Mike'a Bayera. Zadeklaruj następującą klasę w swoim kodzie (oczywiście z niezbędnymi importami):

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 jest teraz specjalnym typem kolumny, który jest używany w definicji modelu.

Więc zamiast

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

Teraz możesz zrobić:

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

Teraz w swoim kodzie możesz przypisać wartości do statuses z listą, a po zapisaniu wykona prawidłowe rzutowanie:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić max_connections dla Postgresa za pomocą polecenia SQL?

  2. Django ładuje się bardzo wolno

  3. Left join z dynamiczną nazwą tabeli pochodzącą z kolumny

  4. PostGIS:Zapytanie o wymiary z i m (linestringzm)

  5. Czy PostgreSQL obsługuje przezroczystą kompresję tabel (fragmentów)?