【问题标题】:ProgrammingErrorL(The SQL contains 0 parameter markers, but 1 parameter were supplied, 'HY000')ProgrammingErrorL(SQL 包含 0 个参数标记,但提供了 1 个参数,'HY000')
【发布时间】:2018-01-11 02:06:33
【问题描述】:

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

 >>> 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)

有谁知道会导致这个问题的原因吗?

【问题讨论】:

  • 是的。 %s 不是参数标记,因此您的 SQL 包含零个参数标记,但您在 var1 中传递了一个。阅读错误消息中的文字、您发布的代码以及此处的数十个现有问题中的任何一个有类似的错误消息,其中一些在相关列表中====>>>>
  • ? 是参数标记,而不是%s
  • 事实上,我已经检查了多个发布的类似问题,他们建议使用?作为参数标记。我也尝试过,但失败并返回错误消息 "pyodbc.Error:(.. Syntax or semantic analysis error ...Encountered:Unexpected character\nExpected:" 。我想知道我是否犯了任何小错误我的代码

标签: python hive odbc


【解决方案1】:

我从我的代码中发现了问题,我正在回答我自己的问题。 应该以这种方式更改代码,它对我有用。我不确定为什么?在我的情况下没有消耗。

 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)

【讨论】:

  • 那个? Hive ODBC 驱动程序不支持参数标记或其他类型(例如:colname)。不幸的是,您发布的当前解决方案是使“参数化查询”起作用的唯一方法。缺点是这会引发 SQL 注入攻击。
  • 我遇到了这个问题,但解决方法不起作用。它导致以下错误。 ProgrammingError: ('42000', "[42000] [Cloudera][ImpalaODBC] (360) 查询执行期间出现语法错误:[HY000] : AnalysisException: 无法解析列/字段引用:'UCSB' \n (360) ( SQLExecDirectW)")
【解决方案2】:

上面提供的解决方案将执行 var1 的字符串替换并发出不带参数化的查询 - 这很糟糕,让您可以进行 SQL 注入

尝试此调整,只需替换 ? 参数标记,并查看 this answer 了解更多信息:

  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)

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多