Pyodbc 未检测 SQL 语句中的参数标记(即 - 插入表 SELECT ...)到 Hive 表。这个问题有解决方法吗?

Posted

技术标签:

【中文标题】Pyodbc 未检测 SQL 语句中的参数标记(即 - 插入表 SELECT ...)到 Hive 表。这个问题有解决方法吗?【英文标题】:Pyodbc not detecting parameter marker in SQL statement (i.e. - Insert into table SELECT ...) to Hive table. Is there a workaround for this issue? 【发布时间】:2021-06-24 20:03:12 【问题描述】:

我的目标是遍历一组值并使用它们运行一组查询,这些查询将使用 pyodbc 将它们的结果插入到 hive 表中。

我试过了

params = ['USA','JP']
set(params)

for i in params:
    cursor.execute(insert into table **some_db.some_tbl** SELECT name, country from **some_db.some_tbl_2** where country = ?,i)

得到了错误

以下并收到错误消息,ProgrammingError: ('The SQL contains 0 parameter markers, but 1 parameters were provided', 'HY000')。

如果我删除 insert into table some_db.some_tbl 部分,它工作正常。不知道还能做什么,因为所有文档和查看类似问题表明我所做的是正确的。

如果我保留 insert into table some_db.some_tbl 部分但删除参数化,它可以正常工作。

【问题讨论】:

你在 some_db.some_tbl 中有多少列?你能像这样发出cursor.execute(insert into some_db.some_tbl(name, country ) SELECT name, country where country = ?,i) some_db.some_tbl 有两列。我正在尝试使用 CTAS、ITAS 的变体(即 - 将表格插入为选择)。如果我省略参数化或插入,这实际上有效,只使用选择。因此,这两种技术似乎都受支持,但是当结合使用时,我得到了原始问题中的错误。 我已经尝试了您建议的方法,但返回相同的错误。由于某种原因,当我使用“插入”时,参数标记未被识别。 【参考方案1】:

我用一个简单的解决方法来回答这个问题,因为它可能会帮助其他人节省一些时间。

由于 'insert without parameterization''select with parameterization' 独立工作,我通过使用 select 语句遍历我的参数来解决这个问题,然后将结果保存到熊猫数据框。然后,您可以从那里对 pandas 数据帧运行插入,而无需为当前迭代进行参数化。所有这些都将在循环体中,因此分别考虑所有参数值。

【讨论】:

以上是关于Pyodbc 未检测 SQL 语句中的参数标记(即 - 插入表 SELECT ...)到 Hive 表。这个问题有解决方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

UPDATE语句pyodbc在sql server中设置NULL值(而不是None)

使用 Access 和 pyodbc 的 INSERT 语句中的语法错误

pyodbc连接MSSQL执行SQL语句

将参数传递给cursor.execute()时pyodbc中的UnicodeDecodeError,但在将参数直接写入字符串时不会

Pyodbc - 使用 WHERE 子句运行 SQL 查询(语法错误)

PyODBC 中的存储过程写道:字符串格式化期间并非所有参数都转换