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

时间:2016-03-30 14:14:53

标签: python django mariadb

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

这似乎适用于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上工作(使用':'指示符)

现在我缺少什么?

2 个答案:

答案 0 :(得分:5)

编辑:

格式需要s后缀如下:

%(u_email)s

答案 1 :(得分:0)

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

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

这里是问题的根源: https://code.djangoproject.com/ticket/10070#comment:18