PyQt中数据库的访问(一)

访问数据库的第一步是确保ODBC数据源配置成功,我接下来会写数据源配置的文章,请继续关注本栏!

(一)数据库连接

self.DB=QSqlDatabase.addDatabase("QODBC")
self.DB.setDatabaseName("Driver={sqlServer};Server=localhost;Database=xx;Uid=xxx;Pwd=xx")
(1)Server=localhost
这是指连接的服务名。如果 ODBC 配通了,数据库还是打不开,可以考虑将连接串里面的
localhost 换成 127.0.0.1 或者主机名。
如 果 目 标 主 机 上 有 多 个 SQL SERVER 服务名,还要在主机名后加上服务名,如
127.0.0.1\MSSQLSERVER
注:在任务管理器--------服务中找以下SQL Server看是否有多个服务名
或者添加端口号,如 127.0.0.1,1433 ,即
self.DB.setDatabaseName("Driver={sqlServer};Server=%s;Database=xx;Uid=xxx;Pwd=xx"%(“127.0.0.1,1443”))

 self.DB.setDatabaseName("Driver={sqlServer};Server=%s;Database=%s;Uid=%s;Pwd=%s"%(“127.0.0.1,1443”,“数据库名”,“登录名”,“密码”))

端口号可以在 SQL Server 配置管理器的 TCP/IP 那里点右键去看。
(2)Database=pyqt
这是指数据库名称,我们连接到的是 pyqt 这个数据库。
(3)Uid=pyqt
这是 ODBC 连接到数据库的登录名,我们这个登陆名叫 pyqt。不推荐用 sa 来登录。
(4)Pwd=
这是数据库登录名对应的密码
数据库连接的另一种写法
self.DB.setHostName("localhost")
self.DB.setDatabaseName("pyqt")
self.DB.setUserName("pyqt")
self.DB.setPassword("xxx")

测试有无打开:
 

if self.DB.open():QMessageBox.warning(self,"正确","打开数据库成功")
elseQMessageBox.warning(self,"错误","打开数据库失败")

这里为防止数据库被打开两次的bug:要加入@pyqtSlot(),完整的为:

 @pyqtSlot()   def on_actOpenDB_triggered(self):self.DB=QSqlDatabase.addDatabase("QODBC")self.DB.setDatabaseName("Driver={sql Server};Server=localhost;Database=pyqt;Uid=pyqt;Pwd=xx")if self.DB.open():QMessageBox.warning(self, "正确", "打开数据成功")else:QMessageBox.warning(self, "错误", "打开数据失败")

其中,on_actOpenDB_triggered():为pyqt的打开按钮对应的槽函数,之后在案例中会整合。

(二)打开数据库

tableModel 是 PyQt 预定义的数据模型,用来作为数据库中一个数据库表的数据模型。
def __openTable(self):self.tabModel=QSqlTableModel(self, self.DB)#数据模型self.tabModel.setTable("employee")#设置数据库#数据库保存方式,OnManualSubmit,OnRowChangeself.tabModel.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit)

(三)删除数据库中某行的数据

 @pyqtSlot()def on_actRecDelete_triggered(self):curIndex=self.selModel.currentIndex()self.tabModel.removeRow(curIndex.row())

on_actRecDelete_triggered为pyqt删除按钮对应的槽函数

(四)保存修改

@pyqtSlot()def on_actSubmit_triggered(self):res=self.tabModel.submitAll()if(res==False):QMessageBox.information(self, "消息", "数据保存错误,错误信息                \n"+self.tabModel.lastError().text())else:self.ui.actSubmit.setEnabled(False)self.ui.actRevert.setEnabled(False)

(五)取消修改

    @pyqtSlot()def on_actRevert_triggered(self):self.tabModel.revertAll()self.ui.actSubmit.setEnabled(False)self.ui.actRevert.setEnabled(False)

(六)添加数据行

 @pyqtSlot() ##添加记录def on_actRecAppend_triggered(self):self.tabModel.insertRow(self.tabModel.rowCount(), QModelIndex())#在末尾添加一个记录curIndex=self.tabModel.index(self.tabModel.rowCount()-1, 1)#创建最后一行的ModelIndexself.selModel.clearSelection()#清空选择项self.selModel.setCurrentIndex(curIndex,QItemSelectionModel.SelectionFlag.Select)#设置刚插入的行为当前选择行currow=curIndex.row()#获得当前行self.tabModel.setData(self.tabModel.index(currow,self.fldNum["EmpNo"]), 2000+self.tabModel.rowCount())#自动生成编号self.tabModel.setData(self.tabModel.index(currow,self.fldNum["Gender"]),"男")

效果:会自动生成编号(如果最后一行是第6行,则生成2006),且默认性别为“男”

(七)插入数据行:和之前添加的效果相同,只是插入是在数据表的中间,添加是在数据表的末尾。

  @pyqtSlot()def on_actRecInsert_triggered(self):curIndex=self.ui.tableView.currentIndex() #QModelIndexself.tabModel.insertRow(curIndex.row(), QModelIndex())self.selModel.clearSelection()#删除已有选择self.selModel.setCurrentIndex(curIndex, QItemSelectionModel.SelectionFlag.Select)currow=curIndex.row() #获得当前行self.tabModel.setData(self.tabModel.index(currow,self.fldNum["EmpNo"]), 2000+self.tabModel.rowCount())#自动生成编号self.tabModel.setData(self.tabModel.index(currow,self.fldNum["Gender"]),"男")

之后会用案例整合总结一下,希望大家多多关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4039.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatGPT AI对话聊天绘画系统开发:打开人工智能AI社交聊天系统开发新时代

人工智能技术的快速发展和普及,催生了众多创新应用,其中,AI社交聊天系统成为当下市场的热门话题,本文将详细介绍开发属于自己的ChatGPT的过程,并探讨当下市场因Chat AI聊天系统所带来的影响性。 AI社交聊天系统的潜力与…

云原生(第一篇)k8s-组件说明

k8s是什么? go语言开发的开源的跨主机的容器编排工具;全称是kubernetes; k8s的组件: master: ①kube-apiserver 所有服务统一的访问入口,无论对内还是对外; ②kube-controller-manager 资源控…

C++11新特性 智能指针

智能指针 nuique_ptr特点不允许拷贝构造和赋值运算符重载-> () *unique_ptr 删除器仿写删除文件删除普通对象 shared_ptr特点示意图仿写shared_ptr删除器部分特化拷贝构造 移动构造 && 左值赋值 和移动赋值完整实现 weak_ptr特点weak_ptr 实现解决循环引用弱指针一个…

事务

事务回顾MySQL事务Spring事务实现编程式事务实现:声明式事务 Transactional 注解作用范围及名称(value/transactionManager)隔离级别:isolation超时时间:timeout修改只读事务指定异常异常捕获情况 事务失效场景Transac…

九、ElasticSearch 运维 -集群维度

1. 查看集群健康 用于简单的判断集群的健康状态,集群内的分片的分配迁移情况。 GET _cluster/health-------------------------Respond----------------------------- {"cluster_name" : "test-jie","status" : "green",…

【Python】 Windows上通过git bash执行python卡住的解决方法

解决方法 编辑 C:\Program Files\Git\etc\profile.d\aliases.sh,将python2.7改成python 编辑完成后,重启git bash, 输入python即可 参考 https://blog.csdn.net/ofreelander/article/details/112058975

List, Set, Ordered-SetHash

前言 本文小结Redis中List,Set,ZSet和Hash四种数据类型的,基本特点,使用场景和实现方式。 一、List 1. 基本特点 a. 作为数组,基于下标索引操作, 但支持正向索引和反向索引; b. 作为链表, 支持高效插入&#xff1b…

Nginx安装、卸载教程(含Window、Linux版、Docker版)

目录 一、下载 二、Linux版安装 2.1 编译安装之前 2.2 编译安装 2.3 启动Nginx 2.4 关于防火墙 2.5 安装成系统服务 三、Linux版卸载(彻底) 3.1 检查一下Nginx服务是否在运行 3.2 停止Nginx服务 3.3 查找、删除Nginx相关文件 3.4 再使用yum清…

设计模式学习之模板方法模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式设计模式学习之抽象工厂模式设计模式学习之策略模式和简单工厂模式的对比设计模式学习之观察者模式 模板方法模式是行为型设计模式的一…

基于深度学习的目标检测的介绍(Introduction to object detection with deep learning)

物体检测的应用已经深入到我们的日常生活中,包括安全、自动车辆系统等。对象检测模型输入视觉效果(图像或视频),并在每个相应对象周围输出带有标记的版本。这说起来容易做起来难,因为目标检测模型需要考虑复杂的算法和数据集,这些…

回顾分类决策树相关知识并利用python实现

大家好,我是带我去滑雪! 决策树(Decision Tree)是一种基本的分类与回归方法,呈树形结构,在分类问题中,表示预计特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为…

深入了解Promise机制并使用JS实现一个Promise(一)

前言 关于为什么会有Promise以及Promise的一些用法和基本机制可以参考之前的文章JS中的异步与Promise使用整体来说,Promise可以帮助我们很好的解决异步的问题,号称是异步的终极解决方案。在浏览器中Promise是使用C实现的,今天就使用js来实现…