#parameters #pyodbc
Вопрос:
Этот код:
cursor.execute('select RLAMBD from ?', OPTable)
print cursor.fetchone().RLAMBD
выдает эту ошибку:
ProgrammingError: ('42S02', '[42S02] [Oracle][ODBC][Ora]ORA-00903: invalid table namen (903) (SQLExecDirectW)')
OPTable — это буквенно-цифровая строка, которую я построил из другого запроса базы данных, содержащего имя таблицы, из которой я хочу выбрать.
Следующий код отлично работает в том же скрипте.
sql = 'select RLAMBD from ' OPTable
cursor.execute(sql)
print cursor.fetchone().RLAMBD
Я думаю, что это не так уж и важно-создавать sql-операторы таким образом, но я просто не понимаю, почему он не принимает ? параметры. У меня даже есть другой запрос в том же скрипте, который использует ? параметризация и работает просто отлично. Однако параметры для рабочего запроса создаются с помощью функции raw_input. Есть ли какая-то тонкая разница между тем, как могут быть отформатированы эти две строки, которая мешает мне заставить запрос работать? Спасибо вам всем.
Я использую python 2.7 и pyodbc 3.0.10.
Комментарии:
1. Я не думаю, что имя таблицы может быть передано в качестве такого параметра, но я могу ошибаться.
Ответ №1:
Заполнители параметров нельзя использовать для представления имен объектов (например, имен таблиц или столбцов) или ключевых слов SQL. Они используются только для передачи значений данных, например, чисел, строк, дат и т.д..
Комментарии:
1. А, ну ладно, стреляй. Итак, строится ли строка отдельно таким образом, чтобы у меня был «правильный» способ сделать это тогда?
2. Да, в подобных случаях нам нужно «собрать» текст команды SQL, но обратите внимание, что мы все равно должны использовать параметры для значений , например,
sql = 'SELECT colname FROM "{}" WHERE id=?'.format(table_name)