#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 и именем таблицы есть пробел