Python ProgrammingErrorL(SQL包含0个参数标记,但提供了1个参数,即HY000';)

Python ProgrammingErrorL(SQL包含0个参数标记,但提供了1个参数,即HY000';),python,hive,odbc,Python,Hive,Odbc,我正在将数据传递到数据库以查询数据库,但遇到以下错误 >>> my_cursor.execute(my_query, var1) Traceback (most recent call last): File "<stdin>", line 1, in <module> pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were

我正在将数据传递到数据库以查询数据库,但遇到以下错误

 >>> my_cursor.execute(my_query,  var1)
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were supplied', 'HY000')

有人知道是什么导致了这个问题吗?

我从我的代码中发现了这个问题,我正在回答我自己的问题。 代码应该以这种方式更改,它适合我。我不知道为什么?在我的情况下没有被消耗掉

 import pyodbc
 import pandas as pd

 var1 = 'UCSB'
 my_connection = pyodbc.connect('DSN=MapR-64-Hive', autocommit=True)
 my_cursor = my_connection.cursor()
 my_query =  """
     select *  from polaris_datasets.snmaster  where parent_pid rlike %s and created_date >=  "2017-12-01 00:00:00"
     """ 

 my_cursor.execute(my_query % var1)

上面提供的解决方案将执行
var1
的字符串替换,并在不进行参数化的情况下发出查询-这是不好的,会让您接受SQL注入

尝试此调整,只需替换
参数标记,有关更多信息,请参阅:

  import pyodbc
  import pandas as pd

  var1 = 'UCSB'
  my_connection = pyodbc.connect('DSN=MapR-64-Hive', autocommit=True)
  my_cursor = my_connection.cursor()
  my_query =  """select * from polaris_datasets.snmaster where parent_pid rlike ? and created_date >= '2017-12-01 00:00:00'""" 

  my_cursor.execute(my_query, var1)

对<代码>%s不是参数标记,因此您的SQL包含零个参数标记,但您正在
var1
中传递一个参数标记。。阅读错误消息中的文字、您发布的代码以及此处存在的数十个问题中的任何一个,这些问题都有类似的错误消息,其中一些问题在那边的相关列表中===>>>。
是参数标记,而不是
%s
。事实上,我已经检查了发布的多个类似问题,他们建议使用?作为参数标记。我也尝试过,但失败了,返回错误消息“pyodbc.error:(..语法或语义分析错误…遇到:意外字符\n预期:”。我想知道我的代码、参数标记或其他类型(例如
:colname
)中是否有任何小错误配置单元ODBC驱动程序不支持。不幸的是,您发布的当前解决方案是使“参数化查询”工作的唯一方法。缺点是这会引发SQL注入攻击。
  import pyodbc
  import pandas as pd

  var1 = 'UCSB'
  my_connection = pyodbc.connect('DSN=MapR-64-Hive', autocommit=True)
  my_cursor = my_connection.cursor()
  my_query =  """select * from polaris_datasets.snmaster where parent_pid rlike ? and created_date >= '2017-12-01 00:00:00'""" 

  my_cursor.execute(my_query, var1)