// 1. 转换成Django查询语法可以这么写 >>> Person.objects.raw('SELECT * FROM myapp_person WHERE id in (%s)'% ('1,2,3')) >>> print(qs.query) SELECT * FROM myapp_person WHERE idin (1,2,3)
// 2. 按照django文档也可以使用params参数 >>> Person.objects.raw('SELECT * FROM myapp_person WHERE id in (%s)', ['1,2,3']) >>> print(qs.query) SELECT * FROM myapp_person WHERE idin (1,2,3)
from django.db import connection print(connection.queries) # SELECT * FROM myapp_person WHERE id in ('1,2,3')
找到问题了,实际上执行的sql参数当成一个字符串了,所以只返回一条记录,
下面就是看下具体处理过程
看源码
1
print(qs.query)
这个打印最终执行只是简单的字符串拼接
1 2 3 4 5 6 7 8 9 10
def__str__(self): """ Return the query as a string of SQL with the parameter values substituted in (use sql_with_params() to see the unsubstituted string). Parameter values won't necessarily be quoted correctly, since that is done by the database interface at execution time. """ sql, params = self.sql_with_params() return sql % params
defstring_literal(self, obj): # real signature unknown; restored from __doc__ """ string_literal(obj) -- converts object obj into a SQL string literal. This means, any special SQL characters are escaped, and it is enclosed within single quotes. In other words, it performs: "'%s'" % escape_string(str(obj)) Use connection.string_literal(obj), if you use it at all. _mysql.string_literal(obj) cannot handle character sets. """ pass