#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. Спасибо вам за это элегантное решение. Это хорошо работает для этого сценария.