实战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 sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from 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 False
    
    query = 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())   

运行结果如下图:

实战PyQt5: 129-SQL数据库操作_第1张图片

QSql数据库模块演示

本文知识点

  • QtSql子模块对SQL的支持。
  • 创建一个简单的数据库并显示它。

前一篇: 实战PyQt5: 128-使用多线程进行并行处理

你可能感兴趣的:(编码,python,pyqt5,pyside2,qt,gui编程)