3

编辑: 请原谅,因为我刚刚意识到我在下面的示例中犯了一个错误。这是我想要实现的目标:

假设我有如下所述的三个表。当用户输入查询时,它将在所有三个表中搜索名称为 LIKE %query% 的结果,但只返回唯一结果。

这是一些示例数据和输出:

数据:

**Grandchild:**
id: 1
name: John
child_id: 1

**Grandchild:**
id: 2
name: Jesse
child_id: 2

**Child:**
id: 1
name: Joshua
parent_id: 1

**Child:**
id: 2
name: Jackson
parent_id: 1

**Parent:**
id: 1
name: Josie

如果用户搜索“j”,它将返回两个 Grandchild 条目:John 和 Jesse。如果用户搜索“j, Joshua”,它将只返回其孩子是 Joshua 的 Grandchildren - 在这种情况下,只有 John。

本质上,我想搜索所有的孙子条目,然后如果用户输入更多的关键词,它会根据他们相关的子条目的名称过滤这些孙子。“j”将返回所有以“j”开头的孙子,“j, Josh”将返回所有以“j”开头且拥有 Child LIKE %Josh% 的孙子。


所以,我有这样的设置:

Grandchild{
   id
   name
   child_id
}

Child{
   id
   name
   parent_id
}

Parent{
   id
   name
}

孙子链接/映射到孩子。Child 映射到 Parent。

我想做的是如下所示,我一次搜索所有三个数据库:

return Grandchild.query.filter(or_(
  Grandchild.name.like("%" + query + "%"),
  Grandchild.child.name.like("%" + query + "%"),
  Grandchild.child.parent.name.like("%" + query + "%")
)).all()

显然上面的查询是不正确的,并返回一个错误:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'name'

我正在尝试的正确方法是什么?

我正在运行 MySQL、Flask-SQLAlchemy(我相信它扩展了 SQLAlchemy)、Flask。

4

1 回答 1

2

至于我,最好修改你的数据模型(如果可能的话)。您可以像这样创建一个自引用表“人员”:

People
{ 
    id,
    name,
    parent_id,
    grandparent_id,
 } 

class People(Base):
    __tablename__ = "people"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(Unicode(255), nullable=False)
    parent_id = Column(Integer, ForeignKey('people.id'))       # parent in hierarchy
    grandparent_id = Column(Integer, ForeignKey('people.id'))  # grandparent in hierarchy

    # relationships
    parent = relationship("People", primaryjoin="People.parent_id==People.id", 
                          remote_side=[id])
    grandparent = relationship("People", primaryjoin="People.grandparent_id==People.id", 
                               remote_side=[id])

然后事情变得更加明显:

session.query(People).filter(People.name.like("%" + query + "%"))
于 2012-07-01T11:01:22.673 回答