【问题标题】:sqlalchemy.exc.CircularDependencyError: Circular dependency detectedsqlalchemy.exc.CircularDependencyError:检测到循环依赖
【发布时间】:2013-08-19 12:26:14
【问题描述】:

业务逻辑 - 一个类别可能有多个 (1:M) 属性,例如类别“内存”可能有属性速度、大小、类型等。

同时一个类别可以按属性值排序(这存储在 Category.sortByAttribute 中 - 这是 LookupCategoryAttributes 表的外键。

尝试通过 SQLAlchemy 构建它,但检测到循环依赖。怎么了?

class Attribute(Base):

    __tablename__ = "LookupCategoryAttributes"

    types = ["date", "float", "integer", "select", "string", "text"]

    # Properties
    ID                       = Column(BigInteger,    primary_key=True)
    categoryID               = Column(BigInteger,    ForeignKey('LookupCategories.ID'), nullable=False )
    attribute                = Column(VARCHAR(255),  nullable=False)
    listValues               = Column(VARCHAR(4000))
    typeID                   = Column(VARCHAR(40),   nullable=False)
    isRequired               = Column(SmallInteger,  nullable=False, default=0)
    displayInMenu            = Column(SmallInteger,  nullable=False, default=0)
    displayInFilter          = Column(SmallInteger,  nullable=False, default=0)


class Category(Base):

    __tablename__ = "LookupCategories"

    # Properties
    ID                       = Column(BigInteger,    primary_key=True)
    category                 = Column(VARCHAR(255),  nullable=False)
    description              = Column(VARCHAR(1000), nullable=False)
    parentCategoryID         = Column(BigInteger,    ForeignKey('LookupCategories.ID'))
    leftPos                  = Column(Integer)
    rightPos                 = Column(Integer)
    sortByAttribute          = Column(BigInteger,    ForeignKey('LookupCategoryAttributes.ID'))
    sortOrder                = Column(SmallInteger,  default=1)


    # Relationships
    ParentCategory    = relationship("Category",  uselist=False, remote_side=[ID], backref='SubCategories')
    SortByAttribute   = relationship("Attribute", uselist=False, foreign_keys=[sortByAttribute], primaryjoin="Attribute.ID==Category.sortByAttribute")
    Attributes        = relationship("Attribute", backref="Category", primaryjoin="Attribute.categoryID==Category.ID")

然后代码如下:

category = Category(record['Name'], extID=extID)
attr1 = Attribute(v)
attr2 = Attribute(v)

category.Attributes.append(attr1)
category.Attributes.append(attr2)
category.SortByAttribute = attr1

当我执行提交时,我得到:

sqlalchemy.exc.CircularDependencyError: Circular dependency detected.

【问题讨论】:

    标签: python sqlalchemy circular-dependency


    【解决方案1】:

    好的,找到了答案 - 在关系中使用 post_update http://docs.sqlalchemy.org/en/latest/orm/relationship_persistence.html#post-update

    所以我在 Category 类中所做的更改为:

    SortByAttribute = relationship(
        "Attribute",
        uselist=False,
        foreign_keys=[sortByAttribute],
        primaryjoin="Attribute.ID==Category.sortByAttribute"
    )
    

    到这里:

    SortByAttribute = relationship(
        "Attribute",
        uselist=False,
        foreign_keys=[sortByAttribute],
        primaryjoin="Attribute.ID==Category.sortByAttribute",
        post_update=True
    )
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2019-01-10
    相关资源
    最近更新 更多