带通配符的PyODBC查询

时间:2018-12-31 07:44:58

标签: python sql ms-access wildcard pyodbc

我试图通过Python使用LIKE运算符运行SQL查询,以查找在任何位置具有“测试”的任何值。问题似乎在于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)

理想的解决方案是filter变量可以只是一个字符串,没有通配符。我应该如何设置过滤器变量和查询的格式?

1 个答案:

答案 0 :(得分:4)

由于历史原因,LIKE查询从Access UI内默认运行,使用*?作为通配符。但是,使用ODBC查询Access数据库的外部应用程序必须使用更常见的%_通配符。

此外,参数 value 必须包含通配符。 (没有通配符的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()