【问题标题】:SQLAlchemy - String replacement for complex queriesSQLAlchemy - 复杂查询的字符串替换
【发布时间】:2017-06-16 04:10:32
【问题描述】:

我有一个我知道有效的查询:

SELECT title FROM paper WHERE MATCH (title) AGAINST ('+exact +representations' IN BOOLEAN MODE)

这将返回包含“exact”和“representations”这两个词的任何论文。使用 SQLAlchemy 的字符串替换,我这样做:

keyword = '+exact +representations'
sql = 'SELECT title FROM paper WHERE MATCH (title) AGAINST (:keyword IN BOOLEAN MODE)'
conn = db.engine.connect()
t = conn.execute(text(sql), keyword=keyword)

这无法仅匹配具有两个关键字的论文。相反,它返回带有任一单词的论文。

我的猜测是,SQLAlchemy 在其预处理步骤中破坏了keyword。如何使用 SQLAlchemy 的字符串替换功能,但仍然做我想做的事?

【问题讨论】:

  • 启用查询日志create_engine(..., echo=True) 以查看发送到 MySQL 的查询。
  • 您是否尝试过将其替换为引号AGAINST (":keyword" IN,因为您的原始SQL 在引号中包含它。
  • @NigelRen 占位符替换将正确处理引用。无需手动引用,这是使用占位符的主要卖点(更不用说不必担心 SQL 注入)。
  • 这对您没有帮助,但在测试数据上尝试了您的确切查询和关键字,包括“exact”、“representations”、“exact representations”、“exact representation”和“ex representation”。它只匹配两个单词的行。我会检查你是否真的按照你在这里写的那样运行你的查询。如果您在问题中包含一个小型测试数据集以及您获得的输出以及您的预期,这也会有所帮助。
  • @IljaEverilä,我确实重新运行了查询并获得了四行“精确表示”。对于它的价值,这就是规范:dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html,例如'apple banana' 将“查找至少包含两个单词之一的行。”

标签: mysql sqlalchemy


【解决方案1】:

我能够使用 SQLAlchemy 的内置 match 函数获得解决方案:

keyword = '"exact representations"'
ids += db.session.query(models.Paper)\
    .filter(models.Paper.title.match(keyword))\
    .all()

FWIW,我无法根据MySQL spec 使用'+exact +representations' 完全匹配这两个词。但这似乎独立于 SQLAlchemy。

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 2021-04-07
    • 2017-09-17
    • 2023-04-08
    • 2012-07-23
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多