SQLAlchemy自引用parent_id dilemna

时间:2011-07-31 19:19:09

标签: python database sqlalchemy

我有一个像这样的Category对象:

def parent_default(context):
    ''' default parent id if the name is not root '''
    id_ = None
    if context.current_parameters['name'] != u'root' :
        id_ = 1
    return id_


class Category(Base):
    ''' Class representing a product category. '''
    __tablename__ = "CATEGORY"
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(50), nullable=False)
    #self-referential mapper
    parent_id = Column(Integer, ForeignKey('CATEGORY.id'), default=parent_default)
    products = relationship("Product", backref="products")
    parent = relationship('Category', remote_side=[id], backref='sub_categories')

    __table_args__ = (
            UniqueConstraint('parent_id', 'name'),
        )

我遇到的问题是我能够用None'parent_id'创建两个'root'对象,似乎UniqueConstraint不适用于None'parent_id'?.理想情况下,只有一个对象具有None parent_id。我必须在这里遗漏一些东西。

1 个答案:

答案 0 :(得分:3)

元组NULL, 'root'是否唯一有点不同,从DBMS到DBMS;最近有人将其添加到sql标准中。在大多数情况下,并非唯一,毕竟NULL = NULL不是真的。

您已经要求根元组的id为1,因此您可以安全地从父ID中删除nullable = True;然后只需将根对象设置为自己的父对象。