假设我的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。
基本上,我想用Flag
中myTable
等于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解决方案。只需要使用游标方式即可。任何帮助将由衷的感谢。
答案 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)