2016-03-06 79 views
6

我想以编程方式构建搜索查询,并且要这样做,我要加入一个表。我可以检查sqlalchemy查询对象以查找已连接的表吗?

class User(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 

class Tag(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id')) 
    title = db.Column(db.String(128)) 
    description = db.Column(db.String(128)) 

这是一个有点人为的例子 - 我希望它是有道理的。

说我的搜索功能看起来像:

def search(title_arg, desc_arg): 
    query = User.query 
    if title_arg: 
     query = query.join(Tag) 
     query = query.filter(Tag.title.contains(title_arg)) 
    if desc_arg: 
     query = query.join(Tag) 
     query = query.filter(Tag.description.contains(desc_arg)) 

    return query 

以前,我一直保留着的轨道,已经在列表中加入了什么样的表,如果表是在列表中,假设它已经加入,并添加过滤器。

如果我可以查看查询对象,请参阅Tag已加入,如果是,则跳过它会很酷。我有一些更复杂的查询构建,真的会从中受益。

如果对于我错过的搜索构建查询有一个完全不同的策略,那也会很棒。或者,如果上面的代码很好,如果我加入表格两次,那也是很好的信息。任何帮助都令人难以置信的赞赏!在query._join_entities

joined_tables = [mapper.class_ for mapper in query._join_entities] 
+0

“查找已连接的表”是您需要跳过重复连接的事情。问你的问题不是解决问题的方法,总是一种很好的做法。例如,询问“如果已经加入,如何跳过加入表格”。 – mtoloo

回答

5

您可以找到连接表按照RMN答案:

在你的项目中初始化一些地方,添加一个unique_join方法将sqlalchemy.orm.Query对象是这样的:

def unique_join(self, *props, **kwargs): 
    if props[0] in [c.entity for c in self._join_entities]: 
     return self 
    return self.join(*props, **kwargs) 

Query.unique_join = unique_join 

现在使用query.unique_join代替query.join

query = query.unique_join(Tag) 
+0

不可能更简单。谢谢! – Hoopes

相关问题