SQLite数据检索问题:修正输入框查询数据的SQL语句
修正检索功能的SQL语句问题
你的show()函数里的SQL查询语句犯了一个典型的语法错误——把INSERT语句的VALUES语法错误地套用到了SELECT查询上。查询数据需要用WHERE子句来指定匹配条件,而不是VALUES。
问题分析
你当前的错误SQL语句:
SELECT * FROM people(name, phone) VALUES(?,?)
这完全不符合SELECT的语法规范,正确的查询逻辑应该是从people表中选取符合输入条件的记录,通过WHERE子句来匹配你输入的姓名和手机号。
修正后的show()函数
根据你的需求(输入已存储的数据检索对应记录),这里分两种常见场景给出修正代码:
场景1:同时匹配姓名和手机号(精确匹配)
如果你需要同时输入姓名和手机号,只返回完全匹配这两个条件的记录:
def show(): name1 = textin.get() phone1 = textinn.get() conn = sqlite3.connect(r'D:\lastfm-dataset-360K\msd.sqlite3') # 用raw字符串避免路径转义问题 with conn: cursor = conn.cursor() # 正确的SELECT语句:用WHERE匹配字段值 cursor.execute('SELECT * FROM people WHERE name = ? AND phone = ?', (name1, phone1)) rows = cursor.fetchall() if rows: for row in rows: print(row) else: print("没有找到匹配的记录") # with块结束后连接会自动关闭,无需额外调用close()
场景2:单独匹配姓名或手机号(灵活检索)
如果你希望可以输入其中一个字段(比如只输姓名,不管手机号)来检索,可以根据输入内容动态调整查询条件:
def show(): name1 = textin.get().strip() phone1 = textinn.get().strip() conn = sqlite3.connect(r'D:\lastfm-dataset-360K\msd.sqlite3') with conn: cursor = conn.cursor() # 根据输入内容生成对应查询逻辑 if name1 and phone1: cursor.execute('SELECT * FROM people WHERE name = ? AND phone = ?', (name1, phone1)) elif name1: cursor.execute('SELECT * FROM people WHERE name = ?', (name1,)) elif phone1: cursor.execute('SELECT * FROM people WHERE phone = ?', (phone1,)) else: print("请输入姓名或手机号进行检索") return rows = cursor.fetchall() if rows: for row in rows: print(row) else: print("没有找到匹配的记录")
额外注意事项
- 路径转义问题:你的数据库路径用了
\,建议加上r前缀变成raw字符串(r'D:\lastfm-dataset-360K\msd.sqlite3'),避免转义字符引发的路径解析错误。 - 连接关闭问题:在
insert()函数里,你用了with conn:块,这个块结束后会自动关闭数据库连接,所以后面的db.close()是多余的,而且db并没有被定义,会引发NameError,建议删除这一行。
内容的提问来源于stack exchange,提问作者T.Gilmour




