Как я могу безопасно и динамически задавать имена столбцов в запросе без использования %s?

#python #sql #sql-server #pymssql

Вопрос:

Я создаю сценарий для коллеги, чтобы он мог создавать отчеты из базы данных SQL Server. Я использую pymssql для управления подключением к базе данных.

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

Я использую этот фрагмент кода, но имя столбца не работает(из того, что я понимаю, они экранируются, и это часть проблемы) против их ввода.

 if len(columns) == 1:  query = "SELECT %s FROM dbo.tblPayments WHERE %s lt; dbo.tblPayments.fldPayDate AND dbo.tblPayments.fldPayDate gt; %s;" else:  query = "SELECT "   ("%s, " * (len(columns) - 1))   "%s FROM dbo.tblPayments WHERE %s lt;= dbo.tblPayments.fldPayDate AND dbo.tblPayments.fldPayDate gt;= %s;"  

Я видел, как люди говорили, чтобы вместо этого использовать конкатенацию .format() строк, но я не хочу вводить риски для безопасности, если смогу их избежать. Есть ли что-то, чего мне не хватает? Что я могу сделать, чтобы сделать его безопасным?

Спасибо

Ответ №1:

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

 SELECT c.name FROM sys.columns c WHERE OBJECT_SCHEMA_NAME ( c.object_id) ='dbo' AND OBJECT_NAME(c.object_id) = 'tblPayments'  

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

1. Спасибо вам за это элегантное решение. Это хорошо работает для этого сценария.