Как передать входные данные пользователя в синтаксис SQL в python

#python #sql

#python #sql

Вопрос:

Я хочу передать переменные пользовательского ввода в SQL через pandas.read_sql_query , используя соединение между pycharm IDE версии 2020.2 и Microsoft SQL Server 2019, которое показано в приведенном ниже коде :

 InputID = int(input('Give me your input MeterpointID: ')) 
OccurDate = input('What is the beginning occurrence datetime (yyyy-mm-dd hh:mm:ss):') 
SQL_Query = pd.read_sql_query('select * from tblprofilewhimp_norm where 
MeterpointID = InputID and Date_M > 'OccurDate'', conn)
  

Однако этот код не работает, и среда IDE показала мне ошибку, подобную этой :

pandas.io.sql.DatabaseError: сбой выполнения в sql ‘выберите * из tblprofilewhimp_norm, где MeterpointID = inputId и Date_M> ‘Дата возникновения»: (’42S22’, «[42S22] [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Недопустимое имя столбца ‘inputId’. (207) (SQLExecDirectW)»)

Итак, не могли бы вы рассказать мне, как справиться с этой проблемой?

Заранее благодарю вас.

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

1. Пожалуйста, исправьте форматирование кода.

2. Ошибка указывает на то, что столбец InputID не существует. Не могли бы вы опубликовать образец данных?

Ответ №1:

Вам нужно будет найти формат заполнителя, используемый библиотекой SQL, а затем передать значения в качестве params аргумента pd.read_sql_query .

Предполагая, что библиотека SQL является pyodbc, формат заполнителя ? и синтаксис будут:

 SQL_Query = pd.read_sql_query(
    'select * from tblprofilewhimp_norm where MeterpointID = ? and Date_M > ?',
    conn,
    params=(InputID, OccurDate),
)
  

Ответ №2:

Используйте строки формата для объединения строк и переменных:

 SQL_Query = pd.read_sql_query('select * from tblprofilewhimp_norm where MeterpointID = {} and Date_M > '{}''.format(InputID, OccurDate), conn)
  

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

1. Большое вам спасибо, сэр. Это очень четкое объяснение.

2. Нет, пожалуйста, не делайте этого; это огромная дыра в безопасности. Вместо этого используйте механизм заполнения, предоставляемый вашей библиотекой SQL.

3. Вот как происходит внедрение SQL; хорошая привычка быть очень параноидальным в любое время, когда строки формата (или эквивалент) используются для создания инструкции SQL. Иногда это неизбежно, но всегда сопряжено с высоким риском. Гораздо безопаснее передавать переменные в params аргументе.