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 语句中的语法错误
将参数传递给cursor.execute()时pyodbc中的UnicodeDecodeError,但在将参数直接写入字符串时不会