【问题标题】:Django creates incorrect MySQL LIKE statementDjango 创建不正确的 MySQL LIKE 语句
【发布时间】:2014-07-21 10:08:09
【问题描述】:

我将 Django 用于使用简单过滤系统的应用程序。我希望过滤器测试我的模型的标题是否包含查询字符串。

代码精简后如下所示:

cards = Card.objects.filter(title__icontains=query)

print cards.query

它返回以下查询(再次,不必要的东西被剥离):

SELECT [...] FROM `ygo_card_card`
WHERE `ygo_card_card`.`title` LIKE %dark%

它不返回任何结果,即使它应该返回。当我手动运行此查询时,我得到了

SQL 错误 (1064):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“%dark%”附近使用正确的语法

如果我在手动运行时将 %dark% 部分放在撇号 ('%dark%') 之间,它会按预期工作。在我看来,Django 创建了一个不正确的查询。这是一个错误还是我可以通过设置控制的东西?

任何搜索都会返回不相关的结果,因为相关的关键字过于笼统。

我使用 Django 1.6.5 和 MySQL 5.5.38,在 Ubuntu Server 14.04 LTS 上运行。

【问题讨论】:

  • 您不应该依赖.query 的值来获取发送到数据库的实际查询,这并不总是真实的反映。
  • 那我应该如何调试呢?查询非常简单,我确信至少有一个模型满足条件。
  • query的值是多少?
  • 写在帖子里,就在 Python 代码下面。
  • @CosminStamate 我的意思是将query 变量的值传递给filter()

标签: python mysql sql django sql-like


【解决方案1】:

回答很简单:我误解了问题。

问题来自一个潜在问题:MySQL LIKE 语句区分大小写或不区分大小写,具体取决于排序规则,并且使用的 Django 过滤器(icontainscontains)对结果没有影响。您可以查看此bug ticket 了解更多信息。

正如Daniel Roseman 指出的那样,.query 属性不可靠,因为查询由数据库驱动程序进一步处理。这让我相信 Django 创建了一个错误的查询,而实际上它只是创建了一个区分大小写的搜索,本应该不区分大小写,因此缺少结果。

最后,通过更改列、表和数据库的排序规则解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多