我正在尝试执行动态构建的原始查询。 为确保参数插入有效位置,我使用的是命名参数。
这似乎适用于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上工作(使用':'指示符)
现在我缺少什么?
答案 0 :(得分:5)
编辑:
格式需要s
后缀如下:
%(u_email)s
答案 1 :(得分:0)
如果您使用的是SQLite3,则由于某种原因语法%(name)s
将不起作用。
如果要将参数作为:name
字典传递,则必须使用{"name":"value"}
语法。
与文档相反,该文档指出第一种语法应适用于所有数据库引擎。
这里是问题的根源: https://code.djangoproject.com/ticket/10070#comment:18