PyQt中使用QtSql连接MySql数据库的方法


Posted in Python onJuly 28, 2020

PyQt 有内置的数据库连接类 QtSql 。

在使用 PyQt 连接 MySql 展示数据时,如果明确所有数据库操作都与 Qt 窗口有关,且不涉及复杂的数据操作,则可以使用内置的 QtSql 类。不需要安装额外的数据库类,且能更加便利的与 QtTableView 等 Qt 控件进行数据交互。

初始化

db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('localhost')
db.setDatabaseName('dev')
db.setUserName('root')
db.setPassword('123')
db.open()

QMYSQL 代表连接 MySql 数据库,可以通过 QtSql.QSqlDatabase.drivers() 来查询当前版本 PyQt 所支持的数据库类型。

数据库连接创建后不需要长期持有 db ,连接会一直存在,直到应用程序关闭或调用 removeDatabase() 为止才会关闭。

操作数据库

一个基础的查询命令如下:

query = QSqlQuery()
isSuccess = query.exec("select count(*) from `user`;")
if not isSuccess:
  print(query.lastError().text())
if query.next():
  count = query.value(0)

创建查询对象

创建 QSqlQuery 对象。此处不需要额外参数,会使用上方初始化时连接的数据库及 database 。

执行命令

调用 exec() 方法执行查询命令。传递参数为查询语句。该方法会返回1个布尔值表示查询是否成功,失败时可以通过调用 lastError().text() 来获取失败原因。

获取查询数据

QSqlQuery 提供了 next() 、 prev() 、 first() 、 last() 和 seek() 等方法在返回的记录中进行导航,可以很容易的进行移动。但需要注意的是, exec() 刚执行结束后是定位在1个无效记录上,必须先导航到1个有效的记录上才能获取数据。

可以通过 isValid() 来判断当前是否处在一条无效的记录上。

另外 next() 、 prev() 、 first() 、 last() 和 seek() 等方法同样有布尔返回值,当导航向的记录无效时会返回 False ,可以通过返回值来辅助判断是否已经查询超出了边界值。

与 QtTableView 进行数据绑定

创建数据模型

self.model = QtSql.QSqlTableModel(self)
self.model.setTable('user')
self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
self.model.select()

setTable() 是指定当前 model 关联的是哪张表。

setEditStrategy() 是设置修改模型。其参数是个枚举,共有3个值。

  • OnFieldChange :模型的任何将立即更新到数据库。
  • OnRowChange :当用户选择不同的行时,将应用对行(改动过的行)的更改。
  • OnManualSubmit :所有更改将在模型中缓存,直到 submitAll() 或者 revertAll() 被调用。

select() 是从关联的表中获取数据,默认是获取全部数据。

关联 QtTableView

self.tableView.setModel(self.model)

将上文创建的 model 设置给 tableView 即可在 tableView 上展示表中数据。

显示的列名默认是数据库中表的列表,可以通过下方代码自定义列名。

self.model.setHeaderData(0, QtCore.Qt.Horizontal, 'ID')

使用 QSqlTableModel 会返回所有列,如果有列不希望展示出来,可以通过下方代码隐藏列。

self.tableView.setColumnHidden(3, True)

到此这篇关于PyQt中使用QtSql连接MySql数据库的方法的文章就介绍到这了,更多相关PyQt  QtSql连接MySql内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
Numpy掩码式数组详解
Apr 17 Python
Python3.6简单反射操作示例
Jun 14 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
Aug 09 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 Python
pycharm全局搜索的具体步骤
Jul 28 #Python
Django model重写save方法及update踩坑详解
Jul 27 #Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 #Python
虚拟机下载python是否需要联网
Jul 27 #Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 #Python
基于python实现操作git过程代码解析
Jul 27 #Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 #Python
You might like
PHP调用三种数据库的方法(3)
2006/10/09 PHP
PHP 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
使用javascript获取页面名称
2014/12/23 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Python实现的HTTP并发测试完整示例
2020/04/23 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
利用python求相邻数的方法示例
2017/08/18 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
求职简历的自我评价
2014/01/31 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
施工安全责任书
2014/04/14 职场文书
爱我中华演讲稿
2014/05/20 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis