【问题标题】:jaydebeapi executemany() method doesn't wok with one parameterjaydebeapi executemany() 方法不适用于一个参数
【发布时间】:2019-12-04 10:22:08
【问题描述】:

jaydebeapi executemany() 方法不能使用只包含一个参数的sql查询,但同时两个参数可以正常工作。

例如给定的查询不执行:

cursor.executemany("DELETE FROM table1 WHERE col1 = ?", tup_df)

这个很好用

cursor.executemany("DELETE FROM table1 WHERE col1 = ? AND col2 = ?", tup_df)

假设AND 之后的表达式使用数据库中的现有列进行操作(使用1 = ? 等一些变通方法没有成功)

使用第一种情况测试代码

df = pandas.DataFrame(data={'col1': [3563412]})

conn = jaydebeapi.connect(jar_class, url, {'user': user, 'password': password}, jar_path)

cursor = conn.cursor()

row_count = 0

for _, df in df.groupby(np.arange(len(df)) // 2000):
    tup_df = [tuple(x) for x in df.values]
    cursor.executemany("DELETE FROM table1 WHERE col1 = ?", tup_df)
    row_count = row_count + cursor.rowcount

print(row_count + ' row(s) processed') 

第二种情况的测试代码

df = pandas.DataFrame(data={'col1': [3563412]})

conn = jaydebeapi.connect(jar_class, url, {'user': user, 'password': password}, jar_path)

cursor = conn.cursor()

row_count = 0

for _, df in df.groupby(np.arange(len(df)) // 2000):
    tup_df = [tuple(x) for x in df.values]
    cursor.executemany("DELETE FROM table1 WHERE col1 = ? AND col2 = ?", tup_df)
    row_count = row_count + cursor.rowcount

print(row_count + ' row(s) processed') 

抛出错误:

Traceback (most recent call last):
  File "test.py", line 21, in <module>
    cursor.executemany("DELETE FROM table1 WHERE col1 = ?", tup_df)
  File "/home/ray/.local/lib/python3.6/site-packages/jaydebeapi/__init__.py", line 516, in executemany
    self._set_stmt_parms(self._prep, parameters)
  File "/home/ray/.local/lib/python3.6/site-packages/jaydebeapi/__init__.py", line 490, in _set_stmt_parms
    prep_stmt.setObject(i + 1, parameters[i])
RuntimeError: No matching overloads found for setObject in find. at native/common/jp_method.cpp:127

当前数据库是 db2,jaydebeapi - 1.1.1,jpype - 0.6.3,python - 3.6。 更改数据库没有帮助。任何帮助将不胜感激。

【问题讨论】:

    标签: python jdbc jaydebeapi


    【解决方案1】:

    我认为问题是由于尝试将 NumPy 值插入数据库而引起的,而这些值并未由 jaydebeapi 或 JPype 处理。

    如果您查看 jaydebeapi 模块的源代码,在/home/ray/.local/lib/python3.6/site-packages/jaydebeapi/__init__.py 根据您问题中的回溯,您可能会看到一条注释掉的行

            # print (i, parameters[i], type(parameters[i]))
    

    在_set_stmt_params 内。这是我机器上的第 489 行。我取消了这一行的注释,运行了你的代码,我得到了以下输出:

    0 3563412 <class 'numpy.int64'>
    

    这告诉我参数值3563412 是一个 NumPy 64 位整数值。

    我最好的猜测是出现错误是因为 jaydebeapi 和 JPype 都不知道如何将其转换为 Java 值。

    在我看来,您必须将数据帧的每一行的值转换为 ints(或其他可以转换为 Java 的 Python 类型),使用类似以下内容:

    tup_df = [tuple(int(y) for y in x) for x in df.values]
    

    我对您的代码进行了此更改,它不再在您的问题中产生错误。

    如果 NumPy 或 Pandas 中有内置函数可以为您执行此操作,请随意使用它。

    顺便说一句,我在使用一个或两个参数时遇到了同样的错误:在双参数情况下,对我来说事情并没有像他们对你所做的那样正常工作。

    【讨论】:

      猜你喜欢
      • 2014-08-11
      • 1970-01-01
      • 2018-07-19
      • 2012-08-30
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多