PyQt6连接SQLite3成功但SQL查询无法执行问题求助
SQLite3连接成功但查询执行失败的解决思路
核心问题分析
你的代码存在三个关键错误,导致查询无法正常执行:
- 连接名未正确绑定:
addDatabase未指定连接名,后续无法通过指定名称获取连接; - SQL参数未绑定:预编译的SQL语句使用了占位符
:user,但未传入实际参数; - 查询成功的判断逻辑错误:使用
isValid()判断查询是否成功,而该方法仅用于判断当前记录是否有效,并非查询执行结果。
修复后的代码
dbcon.py
from PyQt6 import QtSql from PyQt6.QtSql import QSqlDatabase class dbCon: @staticmethod def createConnection1(conn_name): # 传入连接名作为addDatabase的第二个参数,确保后续能精准获取连接 con1 = QtSql.QSqlDatabase.addDatabase('QSQLITE', conn_name) con1.setDatabaseName('Bolt.db') # 仅调用一次open(),避免重复操作 if con1.open(): print("db connection created") return True else: # 打印具体错误信息,便于排查连接失败原因 print(f"db connection creation failed: {con1.lastError().text()}") return False
checkactiveapi.py
from PyQt6.QtSql import QSqlQuery, QSqlDatabase from models.dbcon import dbCon def checkIfApiParamsAreActive(user): conn_name = 'conVal' if dbCon.createConnection1(conn_name): print("Database Connected") # 通过指定连接名获取数据库连接 db = QSqlDatabase.database(conn_name) qry = QSqlQuery(db) # 预编译SQL语句后绑定参数 qry.prepare("SELECT * FROM LOGIN_PARAMS WHERE USER = :user") qry.bindValue(":user", user) # 用exec()的返回值判断查询是否执行成功 if qry.exec(): print("Query executed successfully") # 遍历查询结果 while qry.next(): userInDb = qry.value("USER") apiValidity = qry.value("API_TOKEN_VALIDITY") if user == userInDb and apiValidity == 'True': return True # 未找到匹配用户或有效API return False else: # 打印查询错误详情 print(f"Query Failed: {qry.lastError().text()}") return False
关键修复说明
- 连接名规范:
addDatabase的第二个参数是连接标识,必须传入并后续统一使用该标识获取连接,避免混淆默认连接; - 参数绑定:使用
bindValue()将实际参数传入预编译语句,确保SQL逻辑正确,同时避免SQL注入风险; - 查询结果判断:
exec()返回True表示查询执行成功,之后需调用next()移动到第一条记录,再用isValid()判断当前记录是否有效; - 错误信息输出:通过
lastError().text()获取具体错误内容,可快速定位问题(如表不存在、字段名拼写错误等); - 语法修复:原代码中
while qry.next()缺少冒号,属于基础语法错误,已修正。
内容的提问来源于stack exchange,提问作者Web-bot
相关产品推荐
相关产品推荐

