Динамически передавать имена столбцов в инструкцию SQL — Python-SQL Server

query = ('SELECT ? from table', fields)

Пример «полей» value = name, surname, date

Я могу поместить «поля» в список, но я не знаю, сколько (?) Поместить в запрос. Потому что переменная fields будет включать иногда 5, иногда 10 имен столбцов. Я пытаюсь динамически передавать имена столбцов в запрос.

Как я могу решить эту проблему?

Вызов фрейма, несмотря на все трудности, связанные с попытками настроить его таким образом, вы можете просто выбрать SELECT *, а затем удалить лишние столбцы в Python.

Andy 22.12.2020 17:07

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

Thom A 22.12.2020 17:10

fields = table_rec['columns'] # Я получаю имена столбцов динамически. И на основе этой информации я хочу использовать эту переменную в операторе выбора. Как я уже писал, я не могу знать, сколько столбцов будет. Это зависит от определений таблицы. Так понятно?

Kelaynak 22.12.2020 17:18

Вы не можете передавать имена через ? маркеры параметров (даже если количество символов ? совпадает). Вы должны динамически построить строку запроса SQL с именами, включенными как часть текста.

Fred 22.12.2020 17:26

Как мне это сделать? У меня есть имена столбцов в списке. ВЫБЕРИТЕ {column_names} из {TABLE}

Kelaynak 22.12.2020 17:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
2 169
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Заявление может быть сформировано так. Значения будут выглядеть как «(?, ?, ?, ?)» в зависимости от длины полей.

# 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(запрос)

Kelaynak 22.12.2020 17:47

Пожалуйста, смотрите отредактированный ответ. Я предполагаю, что вы используете pyodc? Я не верю, что вы можете использовать параметры так, как вы пытались установить имена динамических столбцов, но я могу ошибаться.

Jason Cook 22.12.2020 17:55

Отредактированный ответ теперь работает правильно в моем коде. Спасибо

Kelaynak 22.12.2020 18:17

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

Jason Cook 22.12.2020 18:31

За этот ответ не следует голосовать, потому что он допускает внедрение SQL. Пожалуйста, обратитесь realpython.com/prevent-python-sql-injection

Lihka_nonem 17.01.2023 07:20

Совершенно верно, все зависит от того, где, на мой взгляд, собираются входные данные имени динамического столбца. Если вы создаете их самостоятельно, это может быть приемлемо. В частности, для SQL Server вы можете обернуть динамические ссылки в QUOTENAME.

Jason Cook 17.01.2023 17:46

Объединить строку запроса

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, но это не сработало. Я не мог понять, почему?

Kelaynak 22.12.2020 17:43

Убедитесь, что между командным словом FROM и именем таблицы есть пробел.

Rob Py 22.12.2020 19:36

Другие вопросы по теме