Python: cx_ Oracle cursor.execute () зависает при запросе UPDATE - PullRequest
2 голосов
/ 18 июня 2020

Я смотрел похожие вопросы, но пока ничего не помогло

Итак, вот оно. Я хочу обновить свою таблицу с помощью сценария python. Использую модуль cx_ oracle. Я могу выполнить запрос SELECT, но всякий раз, когда я пытаюсь выполнить запрос UPDATE, моя программа просто зависает (зависает). Я понимаю, что мне нужно использовать cursor.commit () после cursor.execute (), если я обновляю таблицу, но мой код никогда не проходит мимо cursor.commit (). Я добавил ниже фрагмент кода, который использую для отладки.

Любые предложения ??

Код

import cx_Oracle

def getConnection():
    ip = '127.0.0.1'
    port = 1521
    service_name = 'ORCLCDB.localdomain'
    username = 'username'
    password = 'password'
    dsn = cx_Oracle.makedsn(ip, port, service_name=service_name)  # (CONNECT_DATA=(SERVICE_NAME=ORCLCDB.localdomain)))
    return cx_Oracle.connect(username, password, dsn) # connection

def debugging():
    con = getConnection()
    print(con)
    cur = con.cursor()
    print('Updating')
    cur.execute('UPDATE EMPLOYEE SET LATITUDE = 53.540943 WHERE EMPLOYEEID = 1')
    print('committing')
    con.commit()
    con.close()
    print('done')

debugging()

** Вот соответствующий результат: **

<cx_Oracle.Connection to username@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLCDB.localdomain)))>
Updating

Решение

Немного покопавшись, я обнаружил основную причину! Я внес изменения в таблицу с помощью Oracle SQL Developer, но не зафиксировал их, когда сценарий python пытался внести изменения в таблицу, он зависал из-за этого. Чтобы избежать зависания, я зафиксировал свои изменения в oracle sql разработчике перед запуском сценария python, и он работал нормально!

1 Ответ

0 голосов
/ 18 июня 2020

Есть ли у вас возможность посмотреть в базе данных? То есть, чтобы понять, проблема в программе python или нет, нам нужно проверить сеанс v $ в базе данных, чтобы понять, заблокировано ли что-то.

select sid, event, last_call_et, status from v$session where sid = xxx 

Где xxx - это sid сеанса, подключенного к python.

Кстати, я бы выбрал явную фиксацию после выполнения курсора

cur.execute('UPDATE EMPLOYEE SET LATITUDE = 53.540943 WHERE EMPLOYEEID = 1')
con.commit()

Надеюсь, это поможет лучше всего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...