You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6连接SQLite3成功但SQL查询无法执行问题求助

SQLite3连接成功但查询执行失败的解决思路

核心问题分析

你的代码存在三个关键错误,导致查询无法正常执行:

  1. 连接名未正确绑定:addDatabase未指定连接名,后续无法通过指定名称获取连接;
  2. SQL参数未绑定:预编译的SQL语句使用了占位符:user,但未传入实际参数;
  3. 查询成功的判断逻辑错误:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:03:14