jaydebeapi executemany() 方法不适用于一个参数
jaydebeapi executemany() method doesn't wok with one parameter
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。
更改数据库没有帮助。任何帮助将不胜感激。
我认为问题是由试图将 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 值。
在我看来,您似乎必须将数据帧的每一行的值转换为 int
s(或其他可以转换为 Java 的 Python 类型),使用如下内容:
tup_df = [tuple(int(y) for y in x) for x in df.values]
我对您的代码进行了此更改,它不再生成您问题中的错误。
如果 NumPy 或 Pandas 中有内置函数可以为您执行此操作,请随时使用它。
顺便说一下,我在一个或两个参数上遇到了同样的错误:在双参数的情况下,事情对我来说并不像他们对你所做的那样正常。
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。 更改数据库没有帮助。任何帮助将不胜感激。
我认为问题是由试图将 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 值。
在我看来,您似乎必须将数据帧的每一行的值转换为 int
s(或其他可以转换为 Java 的 Python 类型),使用如下内容:
tup_df = [tuple(int(y) for y in x) for x in df.values]
我对您的代码进行了此更改,它不再生成您问题中的错误。
如果 NumPy 或 Pandas 中有内置函数可以为您执行此操作,请随时使用它。
顺便说一下,我在一个或两个参数上遇到了同样的错误:在双参数的情况下,事情对我来说并不像他们对你所做的那样正常。