【问题标题】:SQLalchemy + Flask: dynamic AND querySQLalchemy + Flask:动态 AND 查询
【发布时间】:2013-04-02 15:03:42
【问题描述】:

我有项目和标签的 m2m 关系。我希望能够创建一个动态 AND 查询,该查询将获取具有每个列出的标签的每个项目。

这是一个工作示例,但我希望它是动态的(随机数量的标签)。

return Item.query.filter(Item.item_tag.any(name = 'test'))\
.filter(Item.item_tag.any(name = 'tag'))\
.filter(Item.item_tag.any(name = 'tag1'))\
.filter(Item.item_tag.any(name = 'tag2'))\
.all()

这是 or_ 的一个工作示例:

tags = or_( *[Tag.name==x for x in tags] )
return Item.query.join(Tag.items).filter(tags).all()

我正在为 AND 寻找类似的东西。

编辑:为工作 AND 解决方案生成的 sql 是:

SELECT item.id AS item_id, item.title AS item_title, item.url AS item_url, item.body AS item_body, item.itempic AS item_itempic, item.time_published AS item_time_published, item.private AS item_private, item.user_id AS item_user_id FROM item WHERE (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?)) AND (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?))

编辑2:

我需要的示例:Item1 有标签:tag1、tag2、tag3。 item2 有标签:tag1、tag2、tag3、tag4。

搜索标签时:tag1、tag2、tag3。 item1 和 item2 都被返回。搜索标签时:tag1、tag2、tag3、tag4。仅返回 item2。

【问题讨论】:

    标签: python sqlalchemy flask


    【解决方案1】:

    也许我错过了明显的,但是:

    tags = and_( *[Tag.name==x for x in tags] )
    return Item.query.join(Tag.items).filter(tags).all()
    

    参考这个:http://docs.sqlalchemy.org/en/rel_0_8/core/expression_api.html#sqlalchemy.sql.expression.and_

    【讨论】:

    • 当我使用该查询时,它会尝试查找具有多个名称的标签(我认为)。这是为该查询生成的 SQL: SELECT item.id AS item_id, item.title AS item_title, item.url AS item_url, item.body AS item_body, item.itempic AS item_itempic, item.time_published AS item_time_published, item.private AS item_private, item.user_id AS item_user_id FROM tag JOIN item_tag AS item_tag_1 ON tag.id = item_tag_1.tag_id JOIN item ON item.id = item_tag_1.item_id WHERE tag.name = ? AND tag.name = ?
    【解决方案2】:

    我不确定你的问题表述得很清楚。

    为什么要过滤然后遍历任何标签?为什么不只使用 Item.query.all() (如果你需要一个随机集,那么使用 random 模块和 .choice() 来选择一些返回的项目)?

    也许我误解了什么。从来不需要这种查询。

    【讨论】:

    • 那么我应该查询所有项目然后在python代码中执行搜索逻辑吗?我将在我原来的问题中添加一个示例来澄清这一点。
    猜你喜欢
    • 2019-07-15
    • 2013-07-24
    • 1970-01-01
    • 2019-04-23
    • 2019-12-13
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多