Flask-SQLAlchemy无法创建关系 - SAWarning

时间:2014-06-15 16:08:57

标签: python flask sqlalchemy flask-sqlalchemy

我使用fbone启动此项目,并且我正在使用名为 DenormalizedText 的Flask-SQLAlchemy列扩展的实现。我得到了这个概念以及它是如何工作的(不是我的问题),但我对add方法的实现却产生了奇怪的结果。

DenormalizedText

class DenormalizedText(Mutable, types.TypeDecorator):
    """
    Stores denormalized primary keys that can be
    accessed as a set.

    :param coerce: coercion function that ensures correct
               type is returned

    :param separator: separator character
    """

    impl = types.Text

    def __init__(self, coerce=int, separator=" ", **kwargs):

        self.coerce = coerce
        self.separator = separator

    super(DenormalizedText, self).__init__(**kwargs)

    def process_bind_param(self, value, dialect):
        if value is not None:
            items = [str(item).strip() for item in value]
            value = self.separator.join(item for item in items if item)
        return value

    def process_result_value(self, value, dialect):
        if not value:
            return set()
        return set(self.coerce(item) for item in value.split(self.separator))

    def copy_value(self, value):
        return set(value)

我的班级Person有一个名为family DenormalizedText 参数

family = Column(DenormalizedText)

以及添加方法

# just adds each object to the other's family relationship
def add_family(self, person):
    self.family.add(person.id)
    person.family.add(self.id)

所以这里有一些奇怪的东西:

  1. 我为Person建立了另一种关系,对于名为Residence的其他类,完全相同。这很好用。所以我想一分钟也许是自我引用实现的问题。但是fbone使用他们提供的User类做了这个并且有效吗?!

  2. 所以我写了test ... 然后就过去了!

  3. 导致使用此方法的一切正常。两个Person对象都在会话和提交中,我仔细检查"家庭成员"在尝试添加之前(确保它们已保存到数据库并具有ID)。

    1. 偶尔我会收到这个罕见的错误: SAWarning: The IN-predicate on "persons.id" was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate. Consider alternative strategies for improved performance.
  4. 就像我说过这适用于与residences的{​​{1}}关系,但这里是视图和表单处理程序中的相关代码:

    Person

1 个答案:

答案 0 :(得分:0)

我需要休假

错误" SAWarning: The IN-predicate on "persons.id" was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate. Consider alternative strategies for improved performance."是因为我在没有返回任何内容的列上调用查询,或者persons.id的列表是空的,因为没有添加任何内容。

没有添加任何内容,因为我忘记了添加方法底部的这些小行:

def add_family(self, person):
    self.family.add(person.id)
    person.family.add(self.id)
    self.family=set(self.family)
    person.family=set(person.family)

我一团糟。无论如何,如果有人可以提供更好的解释或改进代码,我就不会接受我的答案。