итерация Python cx_oracle - PullRequest
       38

итерация Python cx_oracle

0 голосов
/ 22 мая 2018

У меня есть скрипт на python, который читает строку столбца Excel строка за строкой и возвращает все строки str (значения).Я хочу написать другой скрипт, который позволит поместить эти значения в 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.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Пожалуйста, обратите внимание на другой метод, который пишет в 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 меняется.Но в БД сохраняется только последний req_id.

0 голосов
/ 03 июня 2018

Если я правильно понимаю, что вы пытаетесь сделать здесь, это должно быть сделано в два этапа.Сначала выберите все строки для обновления (на основе выбранного условия), затем вы можете итеративно обновить каждую из этих строк.

Это нельзя сделать в одном запросе (или только в одном условии, которое не изменяется в течение рядазапросы), поскольку SQL работает с наборами, поэтому каждый раз, когда выполняется ваш запрос, вы обновляете всю таблицу, и в итоге получаете только результат последнего запроса.

0 голосов
/ 22 мая 2018

Вы можете использовать выражение «rownum», например:

cur.execute("update TABLE set ROW = rownum where ANOTHER_ROW is null")

Это начнется со значения 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;""")

Это дает вам максимальный контроль.Вы можете использовать любую логику, которая вам нужна, чтобы контролировать, каким должно быть новое значение.

...