当前位置: 首页 > 面试题库 >

具有SQL查询参数的psycopg2 cursor.execute()导致语法错误

欧阳鸿哲
2023-03-14
问题内容

在Python的psycopg2中将参数指定为execute()时,如下所示:

cursor.execute('SELECT * FROM %s', ("my_table", ))

我收到此错误:

psycopg2.ProgrammingError: syntax error at or near "'my_table'"
LINE 1: SELECT * FROM 'my_table'

我究竟做错了什么?看起来psycopg2在查询中添加了单引号,而这些单引号导致了语法错误。

如果我不使用参数,它将正常工作:

cursor.execute('SELECT * FROM my_table')

问题答案:

我相信这样的参数化语句应与 一起使用,而不是与表名(或SQL关键字等)一起使用。因此,您基本上对此感到不走运。

但是,请不要担心,因为该机制旨在防止SQL注入,并且您通常在编写代码时就知道要访问哪个表,因此几乎没有人会注入恶意代码。只需继续并将表写入字符串即可。

如果出于某些(可能是不正确的)原因,您将表名保留为参数形式,例如:

  1. 如果表名来自您的程序(例如,字典或类属性),请执行通常的字符串替换。
  2. 如果表名来自外部世界(请考虑“用户输入”):要么不这样做,要么完全信任用户并采用前面的方法1。

例如:

cursor.execute(
    'SELECT * FROM %s where %s = %s'
    % ("my_table", "colum_name", "%s"), #1
    ("'some;perverse'string;--drop table foobar")) #2

#1:此时将第三个%s替换为另一个’%s’,以允许psycopg2进行后续处理
#2:这是将被psycopg2正确引用并放置在原始字符串中的字符串,而不是第三个’%s’



 类似资料:
  • 有一个数据库保存音乐-艺术家,专辑和曲目。每个专辑都有几首曲目,每首曲目在专辑中都有自己的track_number。我尝试执行一个SQL请求,将一个曲目号向上移动(例如,曲目#4将成为曲目#3),同时将另一个曲目号向下移动(前曲目#3应该成为曲目#4)。SQL代码在MySQL Workbench或SQL sandbox中运行时工作良好,但在通过JDBC启动时会导致错误。 我得到的不是预期的转换:”

  • 这个查询有什么问题? 错误消息: PreparedStatementCallback;错误的SQL语法[选择u.id,u.user_id,count(不同的pf.id),IfNULL(upm.apprum_autoassign_enable,true)来自用户u内部连接user_roles-ur-on-ur.user_ id=u.id左外部连接user_preference_management-

  • 我整合了Swashbuckle。OData 3.2.0和Swashbuckle。我的WepAPI OData webservice中的Core 5.5.3来生成Swagger documentaion。当我试图访问swaggerendpoint(http://localhost:52460/swagger)时,我得到了下面的异常,这似乎是由一个函数(AppointmentsForUsers)引起的

  • 我在寻找一个特定点周围的距离。 我在我的数据库中有这些项目,带有lat和long。 我想得到指定半径范围内的所有结果。 我就是这样得到的: 现在它给了我一个错误: SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第4行(SQL:select*,(6371*acos(cos(radians(51,3))*cos(radia

  • 我遇到了这个错误。 com.mysql.jdbc.exceptions.jdbc4。您有一个错误,在您的SQL语法;检查手册,对应于您的MySQL服务器版本的正确的语法使用附近'like='1',不喜欢='0',mealID='17'WHERE mealID='17"在第1行在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)在

  • 问题内容: 我需要加快在应用程序中执行12个查询的速度。我从常规的foreach切换到Parallel.ForEach。但是有时我会收到一条错误消息,提示“ ExecuteReader需要打开且可用的连接。连接的当前状态为连接中”。据我了解,由于12个查询中的许多查询都使用相同的InitialCatalog,因此12个查询中并没有真正的新连接,这可能是问题所在吗?我怎样才能解决这个问题?“ sql