SQLAlchemy - Как сделать «выбор Django» с помощью SQLAlchemy? - PullRequest
30 голосов
/ 07 июня 2011

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

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

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

Ответы [ 3 ]

23 голосов
/ 07 июня 2011

Использование пользовательских типов .

Пример:

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 ().

20 голосов
/ 23 июля 2015

Я бы, наверное, пошел на sqlalchemy_utils

9 голосов
/ 18 мая 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...