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
我正在尝试执行动态构建的原始查询。 为了确保参数被插入到我使用命名参数的有效位置。
这似乎适用于 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