#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
аргументе.