欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python GUI教程之在PyQt5中使用數(shù)據(jù)庫的方法

 更新時間:2021年09月13日 14:15:46   作者:州的先生博客  
Qt平臺對SQL編程有著良好的支持,PyQt5也一并繼承了過來,這篇文章主要介紹了Python GUI教程之在PyQt5中使用數(shù)據(jù)庫的方法,需要的朋友可以參考下

在桌面圖像化界面編程中,我們通常需要將一些數(shù)據(jù)或配置信息存儲在本地。在本地進行數(shù)據(jù)的存儲,我們可以直接使用文本文件,比如ini文件、csv文件、json文件等,或者是使用文件型的數(shù)據(jù)庫(比如sqlit3)進行存儲。

PyQt5的SQL數(shù)據(jù)庫支持

Qt平臺對SQL編程有著良好的支持,PyQt5也一并繼承了過來。在PyQt5中,QtSql子模塊提供對SQL數(shù)據(jù)庫的支持:

從上圖我們可以發(fā)現(xiàn),QtSQL模塊中包含了很多個類,這些類歸總起來主要包含三大部分:

  • 驅(qū)動層,用于提供特定數(shù)據(jù)庫與SQL API接口之間的低級連接功能;其中包括QSqlDriver、QSqlDriverCreatorBase、QSqlResult;
  • SQL API層,用于提供對數(shù)據(jù)庫的訪問。通常來說,我們會使用QSqlDatabase建立數(shù)據(jù)庫連接,使用QSqlQuery等類實現(xiàn)數(shù)據(jù)庫的交互(執(zhí)行SQL語句)。此外還有QSqlError、QSqlField、QSqlIndex、QSqlRecord等類。
  • 用戶界面操作層,用于將數(shù)據(jù)庫操作的數(shù)據(jù)鏈接到PyQt相應的數(shù)據(jù)小部件,將數(shù)據(jù)和操作展示在Qt界面中。這些類包括:QSqlQueryModel、QSqlTableModel等。

在這些類中,每個類都有自己特定的用途,其中:

  • QSQL:包含整個Qt SQL模塊中使用的各種標識符
  • QSqlDatabase:處理與數(shù)據(jù)庫的連接
  • QSqlDriver:用于訪問特定SQL數(shù)據(jù)庫的抽象基類
  • QSqlDriverCreator:模板類,為特定驅(qū)動程序類型提供SQL驅(qū)動程序工廠
  • QSqlDriverCreatorBase:SQL驅(qū)動程序工廠的基類
  • QSqlError:SQL數(shù)據(jù)庫錯誤信息
  • QSqlField:處理SQL數(shù)據(jù)庫表和視圖中的字段
  • QSqlIndex:用于操作和描述數(shù)據(jù)庫索引的函數(shù)
  • QSqlQuery:執(zhí)行和操作SQL語句的方法
  • QSqlQueryModel:SQL結(jié)果集的只讀數(shù)據(jù)模型
  • QSqlRecord:封裝數(shù)據(jù)庫記錄
  • QSqlRelationalTableModel:具有外鍵支持的單個數(shù)據(jù)庫表的可編輯數(shù)據(jù)模型
  • QSqlResult:用于從特定SQL數(shù)據(jù)庫訪問數(shù)據(jù)的抽象接口
  • QSqlTableModel:單個數(shù)據(jù)庫表的可編輯數(shù)據(jù)模型

在實際的PyQt編程中,我們很少使用驅(qū)動層的類,多通過API層的來建立數(shù)據(jù)庫連接、進行數(shù)據(jù)庫查詢等,然后通過用戶界面操作層的類將數(shù)據(jù)結(jié)果顯示在圖形界面中。下面我們就來簡單使用一下。

在PyQt5中簡單使用數(shù)據(jù)庫

創(chuàng)建一個UI界面

首先,我們通過PyQt5創(chuàng)建一個基本的圖形界面。這個界面由兩個部分組成:

  • 按鈕操作層:用來通過按鈕進行數(shù)據(jù)庫操作;
  • 數(shù)據(jù)庫展示層:用來展示數(shù)據(jù)庫表的信息;

UI界面的代碼如下所示:

# coding:utf-8

from PyQt5 import QtGui,QtCore,QtWidgets,QtSql
import sys

'''
    州的先生 - 在PyQt5中使用數(shù)據(jù)庫
'''

class MainUi(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUi()

    # 初始化UI界面
    def initUi(self):
        # 設置窗口標題
        self.setWindowTitle("州的先生 - 在PyQt5中使用數(shù)據(jù)庫")
        # 設置窗口大小
        self.resize(600,400)

        # 創(chuàng)建一個窗口部件
        self.widget = QtWidgets.QWidget()
        # 創(chuàng)建一個網(wǎng)格布局
        self.grid_layout = QtWidgets.QGridLayout()
        # 設置窗口部件的布局為網(wǎng)格布局
        self.widget.setLayout(self.grid_layout)

        # 創(chuàng)建一個按鈕組
        self.group_box = QtWidgets.QGroupBox('數(shù)據(jù)庫按鈕')
        self.group_box_layout = QtWidgets.QVBoxLayout()
        self.group_box.setLayout(self.group_box_layout)
        # 創(chuàng)建一個表格部件
        self.table_widget = QtWidgets.QTableView()
        # 將上述兩個部件添加到網(wǎng)格布局中
        self.grid_layout.addWidget(self.group_box,0,0)
        self.grid_layout.addWidget(self.table_widget,0,1)

        # 創(chuàng)建按鈕組的按鈕
        self.b_create_db = QtWidgets.QPushButton("創(chuàng)建數(shù)據(jù)庫")
        self.b_create_db.clicked.connect(self.create_db)
        self.b_view_data = QtWidgets.QPushButton("瀏覽數(shù)據(jù)")
        self.b_add_row = QtWidgets.QPushButton("添加一行")
        self.b_delete_row = QtWidgets.QPushButton("刪除一行")
        self.b_close = QtWidgets.QPushButton("退出")
        self.b_close.clicked.connect(self.close)
        # 添加按鈕到按鈕組中
        self.group_box_layout.addWidget(self.b_create_db)
        self.group_box_layout.addWidget(self.b_view_data)
        self.group_box_layout.addWidget(self.b_add_row)
        self.group_box_layout.addWidget(self.b_delete_row)
        self.group_box_layout.addWidget(self.b_close)

        # 設置UI界面的核心部件
        self.setCentralWidget(self.widget)

最終顯示出來的UI界面如下圖所示:

連接一個數(shù)據(jù)庫

在上面創(chuàng)建的UI界面中,我們有一個“創(chuàng)建數(shù)據(jù)庫”的按鈕,這個按鈕我們用來建立一個數(shù)據(jù)庫連接。

Qt中內(nèi)置了好幾個數(shù)據(jù)庫的驅(qū)動程序,也就是說我們可以直接在PyQt中對這些數(shù)據(jù)庫進行操作。這些內(nèi)置的數(shù)據(jù)庫包括:

  • IBM DB2,驅(qū)動名為QDB2;
  • Borland InterBase,驅(qū)動名為QIBASE;
  • MySQL,驅(qū)動名為QMYSQL;
  • Oracle,驅(qū)動名為QOCI;
  • Microsoft SQL Server和其他符合ODBC的數(shù)據(jù)庫,驅(qū)動名為QODBC;
  • PostgreSQL,驅(qū)動名為QPSQL;
  • SQLite2,驅(qū)動名為QSQLITE2;
  • SQLite3,驅(qū)動名為QSQLITE;

通過這些驅(qū)動名,我們可以借助QSqlDatabase類的addDatabase方法添加某個數(shù)據(jù)庫的連接,比如建立一個MySQL數(shù)據(jù)庫的連接為:

db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('主機名')
db.setDatabaseName('數(shù)據(jù)庫名')
db.setUserName('用戶名')
db.setPassword('密碼')
db.open()

為了方便演示,在此我們使用Sqlite數(shù)據(jù)庫。

在MainUi()類中,我們創(chuàng)建一個名為create_db()的方法:

# 創(chuàng)建數(shù)據(jù)庫
    def create_db(self):
        try:
            # 調(diào)用輸入框獲取數(shù)據(jù)庫名稱
            db_text,db_action = QtWidgets.QInputDialog.getText(self,'數(shù)據(jù)庫名稱','請輸入數(shù)據(jù)庫名稱',QtWidgets.QLineEdit.Normal)
            if (db_text.replace(' ','') != '') and (db_action is True):
                print(db_text)
                self.db_name = db_text
                # 添加一個sqlite數(shù)據(jù)庫連接并打開
                db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
                db.setDatabaseName('{}.sqlite'.format(db_text))
                db.open()
                # 實例化一個查詢對象
                query = QtSql.QSqlQuery()
                # 創(chuàng)建一個數(shù)據(jù)庫表
                query.exec_("create table zmister(ID int primary key, "
                            "site_name varchar(20), site_url varchar(100))")
                # 插入三條數(shù)據(jù)
                query.exec_("insert into zmister values(1000, '州的先生', 'https://zmister.com')")
                query.exec_("insert into zmister values(1001, '百度', 'http://www.baidu.com')")
                query.exec_("insert into zmister values(1002, '騰訊', 'http://www.qq.com')")
                print('創(chuàng)建數(shù)據(jù)庫成功')
        except Exception as e:
            print(e)

在這個方法中,我們自定義數(shù)據(jù)庫名并創(chuàng)建一個sqlite數(shù)據(jù)庫,然后在這個數(shù)據(jù)庫中創(chuàng)建了一個名為zmister的數(shù)據(jù)庫表,最后在zmister數(shù)據(jù)庫表中插入了三條數(shù)據(jù)。

接下來,我們將這個方法綁定到【創(chuàng)建數(shù)據(jù)庫】按鈕的點擊事件上:

self.b_create_db.clicked.connect(self.create_db)

這樣,當我們點擊【創(chuàng)建數(shù)據(jù)庫】按鈕的時候,UI界面會彈出一個文本輸入框供我們輸入數(shù)據(jù)庫的名稱,然后創(chuàng)建一個數(shù)據(jù)表并插入數(shù)據(jù):

完成操作之后,會發(fā)現(xiàn)文件同級目錄下多出了一個zmister.sqlite文件,我們使用SQLite Expert等SQLite數(shù)據(jù)庫可視化軟件打開它:

這樣,我們就成功在PyQt5中創(chuàng)建連接并寫入操作了一個數(shù)據(jù)庫。

在UI界面查看和修改數(shù)據(jù)

上面我們創(chuàng)建了一個SQLite數(shù)據(jù)庫并在其中寫入了三條數(shù)據(jù),如何將數(shù)據(jù)表中的數(shù)據(jù)顯示在UI界面中呢。我們可以借助QSqlTableModel類來實現(xiàn)。

還記得我們在創(chuàng)建UI界面的時候,在界面的右方放置了一個QTableView()部件,我們的數(shù)據(jù)庫數(shù)據(jù)將顯示在這上面。

繼續(xù)在MainUi()類中創(chuàng)建一個名為view_data()的方法,在方法中實例化一個QSqlTableModel(),并將QTableView()部件的model模型設置為實例化后的QSqlTableModel():

 # 瀏覽數(shù)據(jù)
    def view_data(self):
        # 實例化一個可編輯數(shù)據(jù)模型
        self.model = QtSql.QSqlTableModel()
        self.table_widget.setModel(self.model)

        self.model.setTable('zmister') # 設置數(shù)據(jù)模型的數(shù)據(jù)表
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) # 允許字段更改
        self.model.select() # 查詢所有數(shù)據(jù)
        # 設置表格頭
        self.model.setHeaderData(0,QtCore.Qt.Horizontal,'ID')
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, '站點名稱')
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, '站點地址')

然后,將view_data()方法綁定在UI界面的【瀏覽數(shù)據(jù)】按鈕的點擊事件中:

self.b_view_data.clicked.connect(self.view_data)

這樣,我們在點擊【瀏覽數(shù)據(jù)】按鈕的時候,會將zmister表中的所有數(shù)據(jù)顯示出來:

除了簡單的將數(shù)據(jù)顯示在UI界面上,我們還可以直接在UI界面上修改數(shù)據(jù):

添加和刪除數(shù)據(jù)

完成查和改的SQL操作之后,我們接著來了解一下如何添加數(shù)據(jù)和刪除數(shù)據(jù)。

添加數(shù)據(jù)通過數(shù)據(jù)模型對象的insertRows()方法來實現(xiàn),刪除數(shù)據(jù)則通過數(shù)據(jù)模型對象的removeRow()方法來實現(xiàn)。

我們繼續(xù)在MainUi()類中創(chuàng)建兩個方法:add_row_data()和del_row_data():

  # 添加一行數(shù)據(jù)行
    def add_row_data(self):
        # 如果存在實例化的數(shù)據(jù)模型對象
        if self.model:
            self.model.insertRows(self.model.rowCount(), 1)
        else:
            self.create_db()

    # 刪除一行數(shù)據(jù)
    def del_row_data(self):
        if self.model:
            self.model.removeRow(self.table_widget.currentIndex().row())
        else:
            self.create_db()

然后將這兩個方法分別綁定在【添加一行】和【刪除一行】按鈕的點擊事件上:

self.b_add_row.clicked.connect(self.add_row_data)
self.b_delete_row.clicked.connect(self.del_row_data)

這樣就實現(xiàn)了UI界面上的添加數(shù)據(jù)和刪除數(shù)據(jù):

這樣,我們就基本實現(xiàn)了使用PyQt5對數(shù)據(jù)庫的增刪改查操作,更加詳細的使用和說明請參考Qt文檔。

到此這篇關(guān)于Python GUI教程之在PyQt5中使用數(shù)據(jù)庫的方法的文章就介紹到這了,更多相關(guān)PyQt5使用數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論