在Django中,我们可以使用非常简单的“选择”,例如:
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
class Foo(models.Model):
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
如何使用SQLAlchemy创建这样的东西?
答案 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