Cx_Oracle 使用 Pandas 数据帧输入更新数据库表

2023-12-19

我在使用包含多列值的 pandas 数据帧更新数据库上的现有表时遇到问题,但我只想根据其他列的条件使用其中一些列更新数据库。

一个例子:

import pandas as pd
import cx_Oracle

d = {'a': ['first', 'second'], 'b': [3, 4], 'c': ['2021-01-01', '2021-01-02'], 'd':[1.1,2.2], 'e':[5,6] }
df = pd.DataFrame(data=d)

#Update to the database
data = list(df.itertuples(index=False, name=None))
DBCONN = cx_Oracle.connect(db_username,db_password,dsn)
conn = DBCONN
cursor = conn.cursor()
query_add_data = """UPDATE my_table SET d = :d, c = :c WHERE a = :a AND b = :b"""
#updating the rows
cursor.executemany(query_add_data, data)
conn.commit()

我收到以下错误:

DatabaseError: ORA-01036: illegal variable name/number

有什么想法我做错了吗?


解决方案是准备数据帧并对其进行子集化,并指定数据帧的列顺序以与我的 sql 查询的顺序完全匹配。例如,我像以前一样重新创建我的数据框:

import pandas as pd
import cx_Oracle

d = {'a': ['first', 'second'], 'b': [3, 4], 'c': ['2021-01-01', '2021-01-02'], 'd':[1.1,2.2], 'e':[5,6] }
df = pd.DataFrame(data=d)

列 e 在 sql 查询中未使用,因此我将其删除。

df = df.drop(['e'], axis=1)

然后我设置列顺序以匹配下面的 sql 查询。

cols = ['d', 'c', 'a', 'b']
df = df[cols]

使用以下相同的代码来更新数据库表:

data = list(df.itertuples(index=False, name=None))
DBCONN = cx_Oracle.connect(db_username,db_password,dsn)
conn = DBCONN
cursor = conn.cursor()
query_add_data = """UPDATE my_table SET d = :d, c = :c WHERE a = :a AND b = :b"""
#updating the rows
cursor.executemany(query_add_data, data)
conn.commit()

这执行得很好,没有错误。这对我来说并不明显,我花了一些时间才弄清楚这一点。我希望它对其他人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cx_Oracle 使用 Pandas 数据帧输入更新数据库表 的相关文章

随机推荐