Невозможно выполнить аналогичный запрос с параметром с помощью pyodbc

Я пытаюсь передать переменную в качестве параметра в запросе доступа, чтобы создать список похожих имен на моем веб-сайте. Я использую pyodbc для доступа к базе данных .mdb для моего приложения Flask. Я пробовал передавать переменную разными способами, например ...

xyz = "SomeName"
cursor.execute('SELECT * FROM Employees WHERE EmployeeName LIKE %?%', xyz)

это не сработало, поэтому я попробовал ...

xyz = "SomeName"
cursor.execute('SELECT * FROM Employees WHERE EmployeeName LIKE ?', "%xyz%")

это не проблема. Переменная больше не является переменной в двойных кавычках, поэтому она запускает xyz как строку. Но запрос работает, когда я передаю его как строку ...

cursor.execute('SELECT * FROM Employees WHERE EmployeeName LIKE ?', "%SomeName%")

Как передать переменную пользовательского ввода, чтобы этот запрос работал? Заранее спасибо.


person Ashwin Krishnaraj    schedule 21.02.2020    source источник


Ответы (1)


Вы можете использовать & для объединения строк в ms-access:

xyz = "SomeName"
cursor.execute('SELECT * FROM Employees WHERE EmployeeName LIKE "%" & ? & "%"', xyz)

В качестве альтернативы вы можете объединить строковую переменную в Python:

xyz = "SomeName"
cursor.execute('SELECT * FROM Employees WHERE EmployeeName LIKE ?', '%' + xyz + '%')
person GMB    schedule 21.02.2020
comment
Драйвер доступа не распознает concat (). Я получил ошибку ... 'pyodbc.ProgrammingError: (' 42000 ', [42000] [Microsoft] [ODBC Microsoft Access Driver] Неопределенная функция' CONCAT 'в выражении. (-3102) (SQLExecDirectW))' - person Ashwin Krishnaraj; 21.02.2020
comment
@AshwinKrishnaraj: да, я потом заметил тег ms-access; вы можете использовать оператор & вместо concat(). - person GMB; 21.02.2020
comment
Я попробовал «EmployeeName LIKE% &? &%» И получил синтаксическую ошибку в выражении запроса «EmployeeName LIKE% & Pa_RaM000 &%. Я также попробовал «Имя сотрудника LIKE% &? &%» И получил «Слишком мало параметров. Ожидается 2 '. - person Ashwin Krishnaraj; 21.02.2020