Django psycopg2奇怪的行为
您需要正确引用SQL命令:Django psycopg2奇怪的行为,django,postgresql,psycopg,Django,Postgresql,Psycopg,您需要正确引用SQL命令: from django.db import connection q = 'some value' sql1 = 'SELECT * FROM table WHERE field LIKE %%%s%%' % q sql2 = 'SELECT * FROM table WHERE field LIKE %%'+ q +'%%' cursor = connection.cursor() cursor.execute( sql1 ) #why exception:
from django.db import connection
q = 'some value'
sql1 = 'SELECT * FROM table WHERE field LIKE %%%s%%' % q
sql2 = 'SELECT * FROM table WHERE field LIKE %%'+ q +'%%'
cursor = connection.cursor()
cursor.execute( sql1 ) #why exception: IndexError: tuple index out of range ?
cursor.execute( sql2 ) #works ok
正确地引用我指的是对类似表达式的
使用单引号。您需要正确地引用SQL参数
正确地引用我指的是使用DBAPI提供的报价工具,而不是在字符串周围添加一个',这是没有用的
正确代码:
sql1 = "SELECT * FROM table WHERE field LIKE '%%%s%%'" % q
sql2 = "SELECT * FROM table WHERE field LIKE '%"+ q +"%'"
q = "%"+q+"%"
cursor.execute( 'SELECT * FROM table WHERE field LIKE %s', (q,) )
真正正确的代码:
sql1 = "SELECT * FROM table WHERE field LIKE '%%%s%%'" % q
sql2 = "SELECT * FROM table WHERE field LIKE '%"+ q +"%'"
q = "%"+q+"%"
cursor.execute( 'SELECT * FROM table WHERE field LIKE %s', (q,) )
假设q=“a'bc”
首先,将其重写为“%a'bc%”
然后将其用作普通字符串参数。psycopg将按其应该的方式将其重写为“%a”\bc%”
如果q可能包含“%”,并且您希望搜索它,那么请使用第二个。使用直接字符串操作几乎肯定会导致不正确的SQL,容易受到SQL注入攻击()
我认为您希望做的是尝试在django中执行类似“%some value%”的操作,对吗
q = "%"+q.replace("%","%%")+"%"
cursor.execute( 'SELECT * FROM table WHERE field LIKE %s', (q,) )
自psycopg2.4.1起,在服务器上执行的SQL为:
from django.db import connection
q = '%some value%'
cur = connection.cursor()
cur.execute("SELECT * FROM table WHERE field LIKE %(my_like)s", {'my_like': q})
哎呀。我打错了这个问题。真正的变量:sql1和sql2类似于您的commentSQL注入,因为q没有正确引用。对于那些不遵循链接的人:“永远,永远,永远,永远不要使用Python字符串连接(+)或字符串参数插值(%)将变量传递给SQL查询字符串。即使是在枪口下。”