如何打印QSqlTableModel/QueryModel发送给数据库的SQL代码?
如何查看QSqlTableModel/QSqlQueryModel发送给数据库的SQL代码
嗨,这个问题我当初调试过滤器的时候也卡过,Qt的这两个模型确实没有直接暴露.sql属性,但有几个实用的方法能帮你拿到实际发送的SQL,完美适配调试需求:
方法一:直接从模型的QSqlQuery对象获取
不管是QSqlTableModel还是QSqlQueryModel,内部都维护着一个QSqlQuery实例,你可以通过它的lastQuery()方法拿到最后执行的SQL语句。
针对QSqlTableModel的例子
比如你的代码可以改成这样:
self.model = QSqlTableModel() self.model.setTable("Person") # 假设你设置了过滤器 self.model.setFilter("age > 18") # 必须先执行select,模型才会生成并执行SQL查询 self.model.select() # 打印实际发送给数据库的SQL print(self.model.query().lastQuery())
这里要注意:只有当模型执行了select()(或者其他触发查询的操作)之后,lastQuery()才会返回有效的SQL语句。
针对QSqlQueryModel的例子
这个更灵活,如果你是自己传入SQL字符串调用setQuery(),可以直接打印自己的SQL;如果想确认模型实际执行的语句,同样用lastQuery():
self.model = QSqlQueryModel() sql_stmt = "SELECT name, age FROM Person WHERE city = 'Beijing'" self.model.setQuery(sql_stmt) # 两种方式都能拿到SQL print(sql_stmt) print(self.model.query().lastQuery())
方法二:开启Qt SQL调试日志(更全面)
如果想看到所有和数据库交互的SQL(包括模型内部自动执行的插入、更新、删除语句,以及绑定的参数值),开启Qt的SQL调试日志是最佳选择。
在PyQt/PySide里,你可以在程序开头添加这段代码:
from PyQt5.QtCore import QLoggingCategory # 开启SQL调试日志 QLoggingCategory.setFilterRules("sql.debug=true")
运行程序后,控制台会输出所有SQL操作的细节,比如:
QSqlQuery::exec: SELECT "id", "name", "age" FROM "Person" WHERE age > 18
QSqlQuery::bindValue: index 0, value: 18
这种方式能帮你看到lastQuery()可能不会显示的参数绑定细节,对调试复杂过滤器特别有用。
内容的提问来源于stack exchange,提问作者Rhdr
相关产品推荐
相关产品推荐

