SQLAlchemy - 如何使用SQLAlchemy制作“django选择”?

时间:2011-06-07 09:03:20

标签: python sqlalchemy

在Django中,我们可以使用非常简单的“选择”,例如:

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

如何使用SQLAlchemy创建这样的东西?

3 个答案:

答案 0 :(得分:23)

使用custom types

示例:

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

答案 1 :(得分:20)

我可能会选择sqlalchemy_utils

答案 2 :(得分:9)

SQLAlchemy有一个Enum类型,其功能类似于Django的“选择”字段。

来自docs

'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