jaydebeapi executemany()方法无法通过一个参数来启动

问题描述 投票:0回答:1

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个回答
0
投票

我认为问题是由于尝试将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(或其他可以转换为Java的其他Python类型):

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

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

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

顺便说一句,使用一个或两个参数时,我会遇到相同的错误:在两参数的情况下,事情似乎对您而言并不正常。

© www.soinside.com 2019 - 2024. All rights reserved.