Python c подкдюченной MS SQL, как в запрос SQL вставить переменную на Python

Запрос SQL тащит сводный отчет за период времени формата дд.мес.год, есть начало периода и конец периода. Я так понимаю что в 01.03.2022 (01-число,03-число,2022-число, а разделительные точки это строка). Как создать переменную в Питоне чтоб начало и конец периода вводить с клавиатуры при запущеной программе питона, а не менять даты каждый раз руками в SQL запросе, пример моего когда и выходящая ошибка.

date1 = input()
date2 = input()
for row in cursor.execute("""declare @DStart datetime, @DFinish datetime, @SFio varchar(50),  @SPodr varchar(50), @CKorp bit, @CSoft bit, @cMetal bit, @COhr bit
-- начало периода
set @DStart=convert(datetime,'date1',104)   --где date1 если вписать руками '01.03.2022'
-- конец периода
set @DFinish=convert(datetime,'date2',104)  --где date1 если вписать '09.03.2022' отчет построит

а с моими переменными python переменными date1 и date2 код выдает такую ошибку:

Traceback (most recent call last): File "G:\t_bot\connection.py", line 23, in for row in cursor.execute("""declare @DStart datetime, @DFinish datetime, @SFio varchar(50), @SPodr varchar(50), @CKorp bit, @CSoft bit, @cMetal bit, @COhr bit pyodbc.ProgrammingError: ('42S22', '[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Недопустимое имя столбца "date1". (207) (SQLExecDirectW); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Недопустимое имя столбца "date2". (207)')

Помогите как вводить произвольные даты с клавиатуры при запуске программы?


Ответы (2 шт):

Автор решения: Zufir

Используйте параметризированные запросы:

for row in cursor.execute("""declare @DStart datetime, @DFinish datetime, @SFio varchar(50),  @SPodr varchar(50), @CKorp bit, @CSoft bit, @cMetal bit, @COhr bit
-- начало периода
set @DStart=convert(datetime,%{date1}s,104)   --где date1 если вписать руками '01.03.2022'
-- конец периода
set @DFinish=convert(datetime,%{date2}s,104)  --где date1 если вписать '09.03.2022' отчет построит", 
{'date1' : date1, 'date2' : date2})

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

→ Ссылка
Автор решения: Kirill

Все как всегда оказалось намного проще. Просто передал в запрос строку!!! Все работает, всем спасибо!!!

d1 = str(input())
d2 = str(input())

for row in cursor.execute("""declare @DStart datetime, @DFinish datetime, @SFio varchar(50),  @SPodr varchar(50), @CKorp bit, @CSoft bit, @cMetal bit, @COhr bit
-- начало периода
set @DStart=convert(datetime,'"""+ d1 +"""',104)
-- конец периода
set @DFinish=convert(datetime,'"""+ d2 +"""' ,104)```
→ Ссылка