如何使用pandas df和cx_Oracle cursor()更新oracle数据库表的一部分?

时间:2019-07-11 07:05:34

标签: python oracle pandas

假设我的Oracle数据库表myTable具有10列和10行数据,其数据类型如下:

   Column         Data_Type
1  Calendarday      Date         *Primary key
2  col1              ...
.                     .
.                     .
.                     .
10 Flag             Number(1,0)

并假设我的熊猫数据框df具有2列和3行数据:

Date          Bit
2000-12-21     1
2000-12-22     1
2000-12-23     1

Dtypes是:datetime64 [ns]和int64。

基本上,我想用FlagmyTable等于Bit的{​​{1}}中df的值更新Calendarday的{​​{1}}列。所以在这里,我只想覆盖3条Date记录,而不是覆盖整个列或整个表。我正在尝试的代码是:

Flag

但是执行此操作会给我错误:

cur = con.cursor()
query = '''insert into myTable (Calendarday, Flag) values (%s, %s);'''
cur.executemany(query, df[['Date', 'Bit']].values.tolist())
con.commit()

我真的不知道如何解决它。我是否需要在cur.executemany(query, df[['Date', 'Bit']].values.tolist()) cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number 中指定列的位置,还是由于熊猫和Oracle之间的日期格式转换问题?请跳过建议的sqlalchemy解决方案。只需要使用游标方式即可。任何帮助将由衷的感谢。

1 个答案:

答案 0 :(得分:0)

您不希望插入,而是批量更新,

首先将您的数据框转换为元组列表。然后通过传递绑定参数来运行更新查询。

data = [tuple(x) for x in df[['Bit', 'Date']].values]

query="""UPDATE mytable SET flag = :bit 
          where calendarday = TO_DATE(:dt,'yyyy-mm-dd') 
      """
cur.executemany(query, data)