PyODBC-запрос с подстановочными знаками - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь выполнить SQL-запрос с оператором LIKE через Python, чтобы найти любые значения, которые имеют «тест» в любой позиции.Кажется, проблема в форматировании того, что следует за оператором LIKE.Там нет сообщений об ошибках, запросы просто пустые.

SQL-запрос, который я пытаюсь имитировать, выглядит следующим образом и работает при выполнении в Access.

SELECT Areas.ID, Areas.Name
FROM Areas
WHERE Name LIKE '*test*'

Вот какподключение и проверка данных выполнены.Никаких проблем.

import pyodbc

# Connect to database
conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Temp\TestDB.accdb;'
    r'Uid=;'
    r'Pwd=;'
    )

# Make cursor
connection = pyodbc.connect(conn_str)
connection.setencoding('utf-8')
cursor = connection.cursor()

# Create test table
cursor.execute("CREATE TABLE Areas (ID integer, Name varchar(255))")
connection.commit()

# Create test data 
cursor.execute("INSERT INTO Areas (ID, Name) VALUES (1,'Example_1');")
cursor.execute("INSERT INTO Areas (ID, Name) VALUES (2,'Example_test_2');")
cursor.execute("INSERT INTO Areas (ID, Name) VALUES (3,'Example_3');")
connection.commit()

# Query filter
Filter = "'*test*'"

Попытка 01

query_01 = cursor.execute(r"""
        SELECT Areas.ID, Areas.Name
        FROM Areas
        WHERE Name LIKE {Filter}
        """.format(Filter=Filter)).fetchall()
for row in query_01:
    print(row)

Попытка 02

query_02 = cursor.execute(r"""
        SELECT Areas.ID, Areas.Name
        FROM Areas
        WHERE Name LIKE ?
        """,("%{}%".format(filter),)).fetchall()
for row in query_02:
    print(row)

Попытка 03, я хотел бы, чтобы фильтр был переменным, но даже "жестко запрограммировано "не работает.

query_03 = cursor.execute(r"""
        SELECT Areas.ID, Areas.Name
        FROM Areas
        WHERE Name LIKE '*test*'
        """).fetchall()
for row in query_03:
    print(row)

Чтобы убедиться, что что-то работает, я запустил это, и он напечатает строку.

query_04 = cursor.execute(r"""
        SELECT Areas.ID, Areas.Name
        FROM Areas
        WHERE Name = 'Example_test_2'
        """).fetchall()
for row in query_04:
    print(row)

Идеальным решением было бы то, что переменная фильтраможет быть просто строка без подстановочных знаков.Как мне отформатировать переменную фильтра и запрос?

1 Ответ

0 голосов
/ 31 декабря 2018

По историческим причинам LIKE запросы выполняются из интерфейса пользователя Access по умолчанию с использованием * и ? в качестве символов подстановки.Однако внешние приложения, использующие ODBC для запроса к базе данных Access, должны использовать более распространенные символы подстановки % и _.

Кроме того, параметр значение должен содержать символы подстановки).(Условие LIKE без подстановочных знаков точно такое же, как условие =.) Заполнителем параметра в тексте команды SQL должен быть только знак вопроса ?.

Наконец, не используйтеconnection.setencoding('utf-8').Access хранит текстовые значения как Unicode, но не использует кодировку UTF-8.Кодировка pyodbc по умолчанию (UTF-16) работает просто отлично.

Итак, вы ищете

filter = 'test'
sql = "SELECT Areas.ID, Areas.Name FROM Areas WHERE Areas.Name LIKE ?"
param = f'%{filter}%'
rows = cursor.execute(sql, param).fetchall()
...