我有我的python脚本,它逐行读取excel列并返回所有行str(values)。 我想编写另一个脚本,允许将这些值放到sql db中。我已经写过连接方法:
def db_connect():
adr = 'some_addr'
uid = 'some_uid'
pwd = 'pwd'
port = port
dsn_tns = cx_Oracle.makedsn(adr, port, SID)
db = cx_Oracle.connect('username', 'pass', dsn_tns)
cur = db.cursor()
cur.execute('update TABLE set ROW = 666 where ANOTHER_ROW is null')
db.commit()
此方法执行更新,但它为所有行设置666。如何通过sql中的迭代来做到这一点?例如,输出的第一行== 1,第二行== 23,第三行== 888。
答案 0 :(得分:1)
如果我理解你在这里要做的事情,那应该分两个阶段完成。首先选择所有行进行更新(基于所选条件),然后您可以迭代更新这些行中的每一行。
不能在单个查询中完成(或者只在单个条件下不会通过大量查询进行更改),因为SQL在集合上工作,这就是为什么每次执行查询时都要更新整个表,最后只得到最后一次查询的结果。
答案 1 :(得分:0)
您可以使用“rownum”表达式,如:
cur.execute("update TABLE set ROW = rownum where ANOTHER_ROW is null")
这将从值1开始,并为每个更新的行递增1。
如果您想要更多地控制要设置的值,您还可以在PL / SQL(未经测试)中执行以下操作:
cur.execute("""
declare
t_NewValue number;
cursor c_Data is
select ROW, ANOTHER_ROW
from TABLE
where ANOTHER_ROW is null
for update;
begin
t_NewValue := 1;
for row in c_Data loop
update TABLE set ROW = t_NewValue
where current of c_Data;
t_NewValue := t_NewValue + 1;
end loop;
end;""")
这使您获得最大的控制权。您可以使用所需的任何逻辑来控制新值应该是什么。
答案 2 :(得分:0)
请看一下写入excel的另一种方法:
adr = 'some_addr'
uid = 'some_uid'
pwd = 'pwd'
port = port
dsn_tns = cx_Oracle.makedsn(adr, port, SID)
db = cx_Oracle.connect('username', 'pass', dsn_tns)
cur = db.cursor()
cells = excel.read_from_cell()
indices_and_statuses = []
stat = execute_script(some_js)
for req_id in cells:
indices_and_statuses.append((cells.index(req_id), stat))
cur.execute("""update TABLE set ROW ="""+"'"+req_id+"'"+"""where ANOTHER_ROW is null""")
db.commit()
db.close()
在此代码中,当您在此FOR语句中放置print(req_id)时,您将看到req_id正在更改。但是在DB中只保存了最后一个req_id。