Django:在原始 SQL 查询中使用命名参数

Django: Using named parameters on a raw SQL query

我正在尝试执行动态构建的原始查询。 为了确保参数被插入到我使用命名参数的有效位置。

这似乎适用于 Sqlite,没有任何问题。 (我所有的测试都成功了) 但是当我 运行 针对 MariaDb 的相同代码时它失败了..

一个简单的示例查询:

 SELECT u.* 
    FROM users_gigyauser AS u
  WHERE u.email like :u_email
    GROUP BY u.id
    ORDER BY u.last_login DESC
  LIMIT 60 OFFSET 0

参数为:

 {'u_email': '%test%'}

我收到的错误是默认语法错误,因为参数没有被替换。 我尝试使用“%”作为指示符,但这导致 sql 试图解析

%u[_email]

然后返回类型错误。

我正在执行这样的查询:

 raw_queryset = GigyaUser.objects.raw(self.sql_fetch, self._query_object['params'])

或计数时:

 cursor.execute(self.sql_count, self._query_object['params'])

两者在 MariaDB 上都给出相同的错误,但在 Sqlite 上工作(使用“:”指示符)

现在我错过了什么?

编辑:

格式需要有s后缀如下:

%(u_email)s

如果您使用的是 SQLite3,由于某些原因语法 %(name)s 将不起作用。 如果您想将参数作为 {"name":"value"} 字典传递,则必须使用 :name 语法。

这与文档相反,该文档指出第一种语法应适用于所有数据库引擎。

问题的根源如下: https://code.djangoproject.com/ticket/10070#comment:18