我试图通过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变量可以只是一个字符串,没有通配符。我应该如何设置过滤器变量和查询的格式?
答案 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()