PyQt6连接MariaDB失败:SQL预执行返回False求助
问题分析与解决方案
你的代码存在几个关键错误,直接导致查询失败,以下是具体修正方案:
1. 数据库驱动选择错误
你要连接的是MariaDB,但代码里误用了QSQLITE驱动(这是SQLite本地文件数据库的驱动)。虽然db.open()返回True,但实际上是创建了一个本地SQLite空数据库,根本没连上MariaDB,自然找不到files表。
修正:将驱动改为QMYSQL:
self.db = QSqlDatabase.addDatabase("QMYSQL")
注意:需确保你的PyQt6环境有MySQL驱动支持。若运行报错找不到驱动,可安装系统依赖(比如Linux下的libmysqlclient-dev、Windows下的MySQL Connector),或使用包含驱动的PyQt6-Qt6包。
2. 缺失错误排查逻辑
仅看open()或prepare()的布尔返回值不够,需通过lastError()获取具体错误信息,方便定位问题:
if not self.db.open(): print("数据库连接失败:", self.db.lastError().text()) else: print("数据库连接成功") self.query = QSqlQuery(self.qry) if not self.query.exec(): print("查询失败:", self.query.lastError().text())
3. QTableView数据绑定方式错误
你手动循环设置item的逻辑完全错误:QTableView需要搭配QSqlQueryModel或QSqlTableModel实现数据绑定,且代码里误用self._table_view(QTableView实例)当作QTableWidgetItem。
正确绑定方式:
# 创建查询模型 model = QSqlQueryModel() model.setQuery(self.qry) # 绑定到TableView self._table_view.setModel(model)
修正后的完整代码
import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView from PyQt6.QtSql import QSqlDatabase, QSqlQueryModel class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self._table_view = QTableView(self) self.setCentralWidget(self._table_view) # 替换为MariaDB驱动 self.db = QSqlDatabase.addDatabase("QMYSQL") self.db.setHostName("127.0.0.1") self.db.setDatabaseName("secqtydb") self.db.setUserName("root") self.db.setPassword("1234") # 检查连接状态 if not self.db.open(): print("数据库连接失败:", self.db.lastError().text()) return print("数据库连接成功") self.qry = "SELECT * FROM files" # 使用查询模型绑定数据到TableView model = QSqlQueryModel() model.setQuery(self.qry) # 检查查询错误 if model.lastError().isValid(): print("查询失败:", model.lastError().text()) else: self._table_view.setModel(model) if __name__ == '__main__': app = QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec())
关于PyQt6教程的问题
PyQt6和PyQt5的API绝大多数兼容,PyQt5的教程几乎可以直接复用,只需注意两点:
- 导入路径从
PyQt5改为PyQt6(比如from PyQt6.QtWidgets import ...) - 少数API有细微参数/返回值调整(比如信号槽的新语法,但旧的
connect方式依然可用)
不需要刻意找PyQt6专属教程,直接用PyQt5教程替换导入语句即可。
内容的提问来源于stack exchange,提问作者Benny Lutin
相关产品推荐
相关产品推荐

