Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django psycopg2奇怪的行为_Django_Postgresql_Psycopg - Fatal编程技术网

Django psycopg2奇怪的行为

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:

您需要正确引用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: 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查询字符串。即使是在枪口下。”