2013-02-22 33 views
1

这是一个后续行动的best-way-to-do-enum-in-sqlalchemy非常有趣的答案。 Cito将Zzzeeks的答案扩展到包括非常好的订购。 Cito在结尾处也留下了一些诱人的代码。SQLAlchemy的枚举代码表示_and_ DB表示

class DeclEnumType(SchemaType, TypeDecorator): 
    """DeclEnum augmented so that it can persist to the database.""" 

这正是我正在尝试构建一个Python数据库中表示它自己的表中的数据库。凡EmployeeType.full_time是Python代码可用已在DB自己的表(对于这个简单的例子只是一个IDX和名称)。

但是,我不知道我理解如何使用CITO的DeclEnumType例子如下面的数据库不创建EmployeeType表。

class EmployeeType(DeclEnum): 
    # order will be as stated: full_time, part_time, contractor 
    full_time = EnumSymbol("Full Time") 
    part_time = EnumSymbol("Part Time") 
    contractor = EnumSymbol("Contractor") 

class Employee(Base): 
    __tablename__ = 'employee' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(60), nullable=False) 
    type = Column(DeclEnumType(EmployeeType)) 

关于如何获得这种双重表示的任何想法?

+0

以及你需要扭转的方式,回到原来的做法,在那里你犯了一个新的映射类EmployeeType,那么每个EnumSymbol()以上其实EmployeeType的一个实例。为了让“看”之类的更简洁的方法,你需要使用元类和各种代理对象和这样的隐藏到底发生了什么的,因为这些EmployeeType情况现在依然存在,并且是唯一只有一个会话等。 - 可行但错综复杂。从Employee到EmployeeType的链接将通过relationship()。 – zzzeek 2013-02-24 21:23:07

+0

有趣的Zzzeek。我对SQLAlchemy相当陌生,但在文档和示例中似乎有一些很好的元类示例。我会锤击它。 – rhaskett 2013-02-25 15:39:35

+0

我对上面的Zzzeek有点困惑。是不是EmployeeType具有EmployeeType的EnumSymbol自引用? – rhaskett 2013-02-25 17:13:48

回答

1

如果我没有记错,这样做的:的

type = Column(EmployeeType.db_type()) 

代替

type = Column(DeclEnumType(EmployeeType)) 

应该这样做。

+0

这将允许Cito的原始示例工作,但Employee将被持久化时,将不会有EmployeeType表。 – rhaskett 2013-02-25 15:42:22