Python jaydebeapi executemany()方法不';单参数炒锅

Python jaydebeapi executemany()方法不';单参数炒锅,python,jdbc,jaydebeapi,Python,Jdbc,Jaydebeapi,使用只包含一个参数的sql查询时,jaydebeapi executemany()方法不起作用,但同时使用两个参数也可以 例如,给定的查询不执行: cursor.executemany("DELETE FROM table1 WHERE col1 = ?", tup_df) 这个很好用 cursor.executemany("DELETE FROM table1 WHERE col1 = ? AND col2 = ?", tup_df) 假设在和之后的表达式使用数据库中的现有列进行操作(使用

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

例如,给定的查询不执行:

cursor.executemany("DELETE FROM table1 WHERE col1 = ?", tup_df)
这个很好用

cursor.executemany("DELETE FROM table1 WHERE col1 = ? AND col2 = ?", tup_df)
假设在
之后的表达式使用数据库中的现有列进行操作(使用一些变通方法,如
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
回溯(最近一次呼叫最后一次):
文件“test.py”,第21行,在
cursor.executemany(“从表1中删除,其中col1=?”,tup_df)
文件“/home/ray/.local/lib/python3.6/site packages/jaydebeapi/_init__.py”,第516行,在executemany中
self.\u set\u stmt\u parms(self.\u prep,参数)
文件“/home/ray/.local/lib/python3.6/site packages/jaydebeapi/\uuu init\uuuuu.py”,第490行,在
准备stmt.setObject(i+1,参数[i])
RuntimeError:在find中找不到与setObject匹配的重载。在native/common/jp_方法中。cpp:127
当前的数据库是db2、jaydebeapi-1.1.1、jpype-0.6.3、python-3.6。
更改数据库没有帮助。任何帮助都将不胜感激。

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

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

        # print (i, parameters[i], type(parameters[i]))
\u set\u stmt\u参数中
。这是我机器上的489号线。我取消了这一行的注释,运行了您的代码,得到了以下输出:

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

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

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

tup_df = [tuple(int(y) for y in x) for x in df.values]
我对您的代码进行了此更改,它不再在您的问题中生成错误

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

顺便说一句,我在一个或两个参数上得到了相同的错误:在两个参数的情况下,事情对我来说不像它们对你所做的那样正常