PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Съхраняване на PostgreSQL ARRAY от ENUM стойности

Считано от 1.3.17 вече не е необходимо заобиколно решение

Отговорът по-долу се озова в документите като ARRAY от ENUM . Тази страница с документи вече казва:

Стар отговор за исторически цели:

Разгледах Проблем 3467 публикувано от Wichert Akkerman и това заобиколно решение беше публикувано. Заслуга на Майк Байер. Декларирайте следния клас във вашия код (с необходимите импортирания, разбира се):

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 вече е специален тип колона, която се използва в дефиницията на модела.

Така че вместо

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

Сега можете да направите:

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

Сега във вашия код можете да присвоите стойности на statuses със списък и ще направи правилното кастинг при запазване:

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. Преобразувайте дата в Юлиански ден в PostgreSQL

  2. Предайте масив от тагове към plpgsql функция и я използвайте в условие WHERE

  3. SQL грешка при опит за създаване на нов тригер

  4. Разбиране на растерни индекси в postgresql

  5. Как се среща с математика, която игнорира годината?