3

編集: すみません、以下の例で間違いを犯したことに気づきました。これが私が達成したいことです:

以下に説明する 3 つのテーブルがあるとします。ユーザーがクエリを入力すると、名前が LIKE %query% である結果の 3 つのテーブルすべてが検索されますが、一意の結果のみが返されます。

データと出力の例を次に示します。

データ:

**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」を検索すると、John と Jesse の 2 つの孫エントリが返されます。ユーザーが「j, Joshua」を検索すると、子が Joshua である孫のみが返されます。この場合は、John のみです。

基本的に、すべての孫エントリを検索したいのですが、ユーザーがさらにキーワードを入力すると、関連する子エントリの名前に基づいてそれらの孫をフィルタリングします。"j" は、"j" で始まるすべての孫を返します。"j, Josh" は、"j" で始まり、%Josh% に似た子を持つすべての孫を返します。


だから、私はこのような設定をしています:

Grandchild{
   id
   name
   child_id
}

Child{
   id
   name
   parent_id
}

Parent{
   id
   name
}

孫は子にリンク/マップされます。子は親にマップされます。

私がやりたいことは、次のようなもので、3 つのデータベースすべてを一度に検索します。

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」を作成できます。

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 に答える