![](/img/trans.png)
[英]How to update a part of oracle database table using pandas df and cx_Oracle cursor()?
[英]Cx_Oracle UPDATE database table with Pandas dataframe input
我在使用具有多列的值的 pandas dataframe 更新数据库上的现有表时遇到问题,但我只想根据其他列的条件使用其中一些列更新数据库。
一个例子:
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
任何想法我做错了什么?
解决方案是准备和子集我的 dataframe,并指定 dataframe 的列顺序以与我的 sql 查询的顺序完全匹配。 例如,我像以前一样重新创建我的 dataframe:
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)
在 sql 查询中未使用列 e,因此我将其删除。
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()
这执行得很好,没有错误。 这对我来说并不明显,我花了一些时间来弄清楚这一点。 我希望它可以帮助其他人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.