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

#python #sql #sql-server #dynamic #multiple-columns

#python #sql #sql-сервер #динамический #несколько столбцов

Вопрос:

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

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

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

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

Комментарии:

1. Проблема с фреймом, несмотря на всю сложность попытки настроить его таким образом, вы могли бы просто ВЫБРАТЬ *, а затем удалить дополнительные столбцы в Python.

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

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

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

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

Ответ №1:

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

 # 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)

 

Комментарии:

1. Это выдает ошибку, когда я пытался выполнить запрос. Ошибка типа: первым выполняемым аргументом должна быть строка или запрос в Юникоде. cur.execute(запрос)

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

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

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

Ответ №2:

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

 str1 = "SELECT "
for fieldname in fields:
    str1 = str1   fieldname   ", "

select_query_string = str1[0:-2]   " from "  table
 

а затем используйте это в запросе

 query=(select_query_string)
 

Комментарии:

1. Это работает, спасибо. Я также хочу добавить имя таблицы параметрическим способом. Я попробовал select_query_string = str1[0:-2] «from» table, но это не сработало. Я не мог понять, почему?

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