Подтвердить что ты не робот

SQLAlchemy - Как сделать "выбор django" с помощью SQLAlchemy?

В Django мы можем использовать очень простые "варианты", например:

GENDER_CHOICES = (
    ('M', 'Male'),
    ('F', 'Female'),
)
class Foo(models.Model):
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

Как сделать что-то подобное с помощью SQLAlchemy?

4b9b3361

Ответ 1

Используйте пользовательские типы.

Пример:

import sqlalchemy.types as types

class ChoiceType(types.TypeDecorator):

    impl = types.String

    def __init__(self, choices, **kw):
        self.choices = dict(choices)
        super(ChoiceType, self).__init__(**kw)

    def process_bind_param(self, value, dialect):
        return [k for k, v in self.choices.iteritems() if v == value][0]

    def process_result_value(self, value, dialect):
        return self.choices[value]

Использование этого будет выглядеть так:

    class Entity(Base):
        __tablename__ = "entity"
        height = Column(
            ChoiceType({"short": "short", "medium": "medium", "tall": "tall"}), nullable=False
        )

Если вы используете Python 3, вы должны изменить iteritems() на items().

Ответ 3

SQLAlchemy имеет тип Enum, который функционирует как поле выбора Django.

Из документов:

'Тип Enum будет использовать собственный внутренний тип ENUM, если таковой имеется; в противном случае он использует тип данных VARCHAR и создает ограничение CHECK. '

import enum
class MyEnum(enum.Enum):
    one = 1
    two = 2
    three = 3


t = Table(
    'data', MetaData(),
    Column('value', Enum(MyEnum))
)

connection.execute(t.insert(), {"value": MyEnum.two})
assert connection.scalar(t.select()) is MyEnum.two