实战PyQt5: 129-SQL数据库操作


实战PyQt5: 129-SQL数据库操作文章插图
【实战PyQt5: 129-SQL数据库操作】Qt平台对SQL编程有着良好的支持 , QtSql子模块提供对SQL数据库的支持 。
Qt中SQL数据库模块简介QtSql模块包含了多个类 , 这些类大致可以分为三个部分:

  • 驱动层 , 用于提供特定数据库与SQL API接口之间的低级连接功能;其中包括QSqlDriver、QSqlDriverCreatorBase、QSqlResult;
  • SQL API层 , 用于提供对数据库的访问 。 通常来说 , 我们会使用QSqlDatabase建立数据库连接 , 使用QSqlQuery等类实现数据库的交互(执行SQL语句) 。 此外还有QSqlError、QSqlField、QSqlIndex、QSqlRecord等类;
  • 用户界面操作层 , 用于将数据库操作的数据链接到PyQt相应的数据部件 , 将数据和操作展示在Qt界面中 。 这些类包括:QSqlQueryModel、QSqlTableModel和QSqlRelationTableModel等 。
Qt中SQL模块类SQL模块中的类包括:
  • QSQL:包含整个Qt SQL模块中使用的各种标识符 。
  • QSqlDatabase:处理与数据库的连接 。
  • QSqlDriver:用于访问特定SQL数据库的抽象基类 。
  • QSqlDriverCreator:模板类 , 为特定驱动程序类型提供SQL驱动程序工厂类 。
  • QSqlDriverCreatorBase:SQL驱动程序工厂类的基类 。
  • QSqlError:SQL数据库错误信息 。
  • QSqlField:处理SQL数据库表和视图中的字段 。
  • QSqlIndex:用于操作和描述数据库索引的函数 。
  • QSqlQuery:执行和操作SQL语句的方法 。
  • QSqlQueryModel:SQL结果集的只读数据模型 。
  • QSqlRecord:封装数据库记录 。
  • QSqlRelationalTableModel:具有外键支持的单个数据库表的可编辑数据模型 。
  • QSqlResult:用于从特定SQL数据库访问数据的抽象接口 。
  • QSqlTableModel:单个数据库表的可编辑数据模型 。
Qt中可用SQL数据库QSqlDatabase类用于连接数据库 , 可以使用数据库驱动与不同的数据库进行交互 , 一个QSqlDatabase实例代表一次数据库连接 。 可支持数据库驱动如下:
  • QDB2: IBM DB2驱动程序 。
  • QMYSQL: MySQL驱动程序 。
  • QOCI: Oracle调用接口驱动程序 。
  • QODBC: ODBC驱动程序(包括MS SQL Server) 。
  • QPSQL: PostgreSQL驱动程序 。
  • QSQLITE: SQLite3驱动程序 。
  • QSQLITE2: SQLite2驱动程序 。
QSqlDatabase类的常用方法
  • addDataBase(): 静态函数 , 设置连接数据库的数据库驱动类型 。
  • open(self): 打开数据连接 。
  • setDatabaseName(self, name: str):设置所连接的数据库名称 。
  • setHostName(self, host: str):设置数据库所在的主机名称 。
  • setUserName(self, name :str):指定连接的用户名 。
  • setPassword(self, password: str):设置连接对象的密码 。
  • commit(self):提交事务 , 如果执行成功返回True 。
  • rollback(self):回滚数据库事务 。
  • close(self):关闭数据库连接 。
测试使用QSqlDatabase.addDatabase()添加一个数据库, 将数据的名称设置为(':memory:')表示在内存在建立的一个临时数据库 。 然后创建一个名称为'person'的个人信息表 , 并添加一个人信息 , 然后是有QTableView显示出来 。完整代码如下:
import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import (QApplication, QMessageBox, QTableView)from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel def createConnection():db = QSqlDatabase.addDatabase('QSQLITE')db.setDatabaseName(':memory:')if not db.open():QMessageBox.critical(None, '不能打开数据库','不能建立数据库连接, 这个例子需要SQLit支持\n''要获取如何建立数据库连接 , 请参考Qt SQL技术文档\n\n''点击Cancel按钮退出',QMessageBox.Cancel)return Falsequery = QSqlQuery()query.exec("create table person(id int primary key, name varchar(20), address varchar(30))")query.exec("insert into person values(101, '李世民', '西安')")query.exec("insert into person values(102, '赵匡胤', '开封')")query.exec("insert into person values(103, '朱元璋', '南京')")return True class DemoSQL(QTableView):def __init__(self, parent=None):super(DemoSQL, self).__init__(parent)# 设置窗口标题self.setWindowTitle('实战 Qt for Python: SQL数据库演示')# 设置窗口大小self.resize(400, 300)model = QSqlTableModel()model.setTable('person')model.setEditStrategy(QSqlTableModel.OnManualSubmit)model.select()model.setHeaderData(0, Qt.Horizontal, '编号')model.setHeaderData(1, Qt.Horizontal, '姓名')model.setHeaderData(2, Qt.Horizontal, '地址')self.setModel(model)if __name__ == '__main__':app = QApplication(sys.argv)if not createConnection():sys.exit(1)window = DemoSQL()window.show()sys.exit(app.exec())