如何将自动增量列值用作另一个不可为空的列的默认值?

时间:2014-09-17 09:59:24

标签: python sqlalchemy

假设我们UserModel有以下列:

class UserModel(declarative_base(bind=engine)):
    __tablename__ = "users"

    id = Column(Integer, autoincrement=True, primary_key=True)
    nickname = Column(String, unique=True, nullable=False)

有没有办法将id设置为nickname的默认值而不更改模型类之外的任何内容?

我尝试使用default=idserver_default=id,但始终在commit上引发IntegrityError。

另外,我知道在执行idcommit之前没有flush,但在我之外调用flush不是一个选项。

感谢。

1 个答案:

答案 0 :(得分:0)

您应该使用hybrid_property。这里的例子:

class UserModel(Base):
    __tablename__ = "users"

    id = Column(Integer, autoincrement=True, primary_key=True)
    nickname_str = Column(String, unique=True)

    @hybrid_property
    def nickname(self):
        return self.nickname_str or str(self.id)

    @nickname.expression
    def nickname(self):
        return case(
            [(self.nickname_str != None, self.nickname_str)],
            else_=cast(self.id, String)
        ).label('nickname')

    @nickname.setter
    def nickname(self, value):
        self.nickname_str = value

完整示例here