cx_oracle python 迭代

cx_oracle python iteration

我有我的 python 脚本,它逐行读取 excel 列和 returns 所有行 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.

您可以使用 "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;""")

这给了你最大的控制权。您可以使用您需要的任何逻辑来控制新值应该是什么。

请看另一种写入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()

并且在这段代码中,当您将 print(req_id) 放入此 FOR 语句中时,您将看到 req_id 正在发生变化。但是在 DB 中只保存了最后一个 req_id。

如果我理解正确的话,你想在这里做什么应该分两个阶段完成。首先 select 更新所有行(根据选择的条件),然后您可以迭代更新这些行中的每一行。

它不能在单个查询中完成(或者仅在多个查询不会改变的单个条件下完成),因为 SQL 适用于集合,这就是为什么每次执行查询时你都在更新整个table,最后只得到上次查询的结果。