2014-11-13 2 views
0

В моем коде Python, когда я прошу пользователю ввести строку для выбора, он работает, но когда я пытаюсь UPDATE, используя один и тот же вход не позволяет мне выполнятьPython cx_Oracle Update

Вот мой код после соединение было успешно сделано

curs = connection.cursor() 
str_input1 = str(input("Input : ")) 
str_input2 = str(input("Input : ")) 
statement = "UPDATE table SET variable1 = "+str_input1+" WHERE name = "+str_input2 
curs.execute(statement) 
connection.commit 

В теории это следующий код должен работать и обновлять переменную, но вместо этого я получаю ошибку в строке curs.execute (заявление) о том,

cx_Oracle.DatabaseError: ORA-00904: John: invalid identifier 

Джон был str_input2, где статья

Возможно, это формат, который давал мне ошибку, но я не уверен.

Может кто-нибудь указать, в чем была проблема с моим кодом?

ответ

3

Ошибка в том, что вы не указываете значения. Вы получите ту же самую ошибку из инструкции SELECT.

Этих операторов поиск строк, где name столбца совпадает со строкой John:

SELECT * FROM table WHERE name = "John" 
UPDATE table SET variable1 = "Hi" WHERE name = "John" 

Этих операторами поиск строк, где name столбцов соответствуют John столбца и если нет John колонок, это ошибка :

SELECT * FROM table WHERE name = John 
UPDATE table SET variable1 = "Hi" WHERE name = John 

Таким образом, вы могли исправить это просто положить кавычки вокруг значений.

Но вы действительно, действительно, действительно не должны. Это откроет вам до SQL injection attacks и глупых ошибок, где вы не приводите или не вызываете специальные символы должным образом, и проблемы с производительностью, когда механизм базы данных не может сказать, что вы используете один и тот же запрос много раз и т. Д.

Что вы хотите сделать, это использовать SQL parameters вместо того, чтобы пытаться форматировать строку. Я не помню, какой параметр стиля используется cx_Oracle, но вы можете просто import cx_Oracle; print(cx_Oracle.paramstyle), и посмотрите его in the table, чтобы узнать. А потом что-то вроде:

statement = "UPDATE table SET variable1 = :v WHERE name = :n" 
curs.execute(statement, {'v': str_input1, 'n': str_input2}) 

Кроме того, несколько боковых нот:

  • connection.commit ничего не делает; вы просто ссылаетесь на метод commit, не называя его. Вам нужны круглые скобки: connection.commit()
  • str(input()) Бессмысленно. Функция input всегда возвращает строку, поэтому нет причин для вызова str. (Если вы не используете Python 2.x, в этом случае вы должны использовать raw_input(), который возвращает строку, вместо того, чтобы использовать input до eval, строка, открывающая те же проблемы безопасности, что и атака SQL-инъекций выше чтобы преобразовать его обратно в строку.)
+0

Спасибо за кучу за отличный ответ! – dnTosh

Смежные вопросы