我使用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)
所以这里有一些奇怪的东西:
我为Person
建立了另一种关系,对于名为Residence
的其他类,完全相同。这很好用。所以我想一分钟也许是自我引用实现的问题。但是fbone使用他们提供的User
类做了这个并且有效吗?!
所以我写了test ... 然后就过去了!
导致使用此方法的一切正常。两个Person
对象都在会话和提交中,我仔细检查"家庭成员"在尝试添加之前(确保它们已保存到数据库并具有ID)。
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.
就像我说过这适用于与residences
的{{1}}关系,但这里是视图和表单处理程序中的相关代码:
Person
答案 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)
我一团糟。无论如何,如果有人可以提供更好的解释或改进代码,我就不会接受我的答案。