query = ('SELECT ? from table', fields)
Пример «полей» value = name, surname, date
Я могу поместить «поля» в список, но я не знаю, сколько (?) Поместить в запрос. Потому что переменная fields будет включать иногда 5, иногда 10 имен столбцов. Я пытаюсь динамически передавать имена столбцов в запрос.
Как я могу решить эту проблему?
Вы должны использовать для этого динамический SQL, и это быстро (скорее всего) станет беспорядочным. Это пахнет XY проблемой. Какую проблему вы действительно пытаетесь решить?
fields = table_rec['columns'] # Я получаю имена столбцов динамически. И на основе этой информации я хочу использовать эту переменную в операторе выбора. Как я уже писал, я не могу знать, сколько столбцов будет. Это зависит от определений таблицы. Так понятно?
Вы не можете передавать имена через ? маркеры параметров (даже если количество символов ? совпадает). Вы должны динамически построить строку запроса SQL с именами, включенными как часть текста.
Как мне это сделать? У меня есть имена столбцов в списке. ВЫБЕРИТЕ {column_names} из {TABLE}
Заявление может быть сформировано так. Значения будут выглядеть как «(?, ?, ?, ?)» в зависимости от длины полей.
# create a comma separated list of question marks
# then surround with parenthesis
values = '('+', '.join(['?']*len(fields))+')'
query=('SELECT '+values+' from table',fields)
Не говорю, что это сработает, поскольку вы не рассказали о том, как вы подключаетесь к SQL Server или запрашиваете его.
Вместо этого вы можете использовать метод join str:
table_name = 'MyTable'
fields = ['col1','col2','col3']
values = ', '.join(fields)
statement = 'SELECT '+values+' from '+table_name
query
'SELECT col1, col2, col3 from MyTable'
query=(statement)
Выдает ошибку, когда я пытаюсь выполнить запрос. TypeError: первый аргумент для выполнения должен быть строковым или юникодным запросом. cur.execute(запрос)
Пожалуйста, смотрите отредактированный ответ. Я предполагаю, что вы используете pyodc? Я не верю, что вы можете использовать параметры так, как вы пытались установить имена динамических столбцов, но я могу ошибаться.
Отредактированный ответ теперь работает правильно в моем коде. Спасибо
Пожалуйста, проголосуйте за любые ответы, которые вы считаете полезными, и отметьте ответы как принятые, если они решают вашу проблему. Спасибо.
За этот ответ не следует голосовать, потому что он допускает внедрение SQL. Пожалуйста, обратитесь realpython.com/prevent-python-sql-injection
Совершенно верно, все зависит от того, где, на мой взгляд, собираются входные данные имени динамического столбца. Если вы создаете их самостоятельно, это может быть приемлемо. В частности, для SQL Server вы можете обернуть динамические ссылки в QUOTENAME.
Объединить строку запроса
str1 = "SELECT "
for fieldname in fields:
str1 = str1 + fieldname + ", "
select_query_string = str1[0:-2] + " from " +table
а затем использовать это в запросе
query=(select_query_string)
Это работает, спасибо. Я также хочу добавить имя таблицы параметрическим способом. Я пробовал select_query_string = str1[0:-2] + "from" + table, но это не сработало. Я не мог понять, почему?
Убедитесь, что между командным словом FROM и именем таблицы есть пробел.
Вызов фрейма, несмотря на все трудности, связанные с попытками настроить его таким образом, вы можете просто выбрать SELECT *, а затем удалить лишние столбцы в Python.