在桌面圖像化界面程式設計中,我們通常需要将一些資料或配置資訊存儲在本地。在本地進行資料的存儲,我們可以直接使用文本檔案,比如ini檔案、csv檔案、json檔案等,或者是使用檔案型的資料庫(比如sqlit3)進行存儲。
PyQt5的SQL資料庫支援
Qt平台對SQL程式設計有着良好的支援,PyQt5也一并繼承了過來。在PyQt5中,QtSql子子產品提供對SQL資料庫的支援:

從上圖我們可以發現,QtSQL子產品中包含了很多個類,這些類歸總起來主要包含三大部分:
● 驅動層,用于提供特定資料庫與SQL API接口之間的低級連接配接功能;其中包括QSqlDriver、QSqlDriverCreatorBase、QSqlResult;
● SQL API層,用于提供對資料庫的通路。通常來說,我們會使用QSqlDatabase建立資料庫連接配接,使用QSqlQuery等類實作資料庫的互動(執行SQL語句)。此外還有QSqlError、QSqlField、QSqlIndex、QSqlRecord等類。
● 使用者界面操作層,用于将資料庫操作的資料連結到PyQt相應的資料小部件,将資料和操作展示在Qt界面中。這些類包括:QSqlQueryModel、QSqlTableModel等。
在這些類中,每個類都有自己特定的用途,其中:
● QSQL:包含整個Qt SQL子產品中使用的各種辨別符
● QSqlDatabase:處理與資料庫的連接配接
● QSqlDriver:用于通路特定SQL資料庫的抽象基類
● QSqlDriverCreator:模闆類,為特定驅動程式類型提供SQL驅動程式工廠
● QSqlDriverCreatorBase:SQL驅動程式工廠的基類
● QSqlError:SQL資料庫錯誤資訊
● QSqlField:處理SQL資料庫表和視圖中的字段
● QSqlIndex:用于操作和描述資料庫索引的函數
● QSqlQuery:執行和操作SQL語句的方法
● QSqlQueryModel:SQL結果集的隻讀資料模型
● QSqlRecord:封裝資料庫記錄
● QSqlRelationalTableModel:具有外鍵支援的單個資料庫表的可編輯資料模型
● QSqlResult:用于從特定SQL資料庫通路資料的抽象接口
● QSqlTableModel:單個資料庫表的可編輯資料模型
在實際的PyQt程式設計中,我們很少使用驅動層的類,多通過API層的來建立資料庫連接配接、進行資料庫查詢等,然後通過使用者界面操作層的類将資料結果顯示在圖形界面中。下面我們就來簡單使用一下。
在PyQt5中簡單使用資料庫
建立一個UI界面
首先,我們通過PyQt5建立一個基本的圖形界面。這個界面由兩個部分組成:
● 按鈕操作層:用來通過按鈕進行資料庫操作;
● 資料庫展示層:用來展示資料庫表的資訊;
UI界面的代碼如下所示:
-
# coding:utf-8
-
from PyQt5 import QtGui,QtCore,QtWidgets,QtSql
-
import sys
-
'''
-
州的先生 - 在PyQt5中使用資料庫
-
'''
-
class MainUi(QtWidgets.QMainWindow):
-
def __init__(self):
-
super().__init__()
-
self.initUi()
-
# 初始化UI界面
-
def initUi(self):
-
# 設定視窗标題
-
self.setWindowTitle("州的先生 - 在PyQt5中使用資料庫")
-
# 設定視窗大小
-
self.resize(600,400)
-
# 建立一個視窗部件
-
self.widget = QtWidgets.QWidget()
-
# 建立一個網格布局
-
self.grid_layout = QtWidgets.QGridLayout()
-
# 設定視窗部件的布局為網格布局
-
self.widget.setLayout(self.grid_layout)
-
# 建立一個按鈕組
-
self.group_box = QtWidgets.QGroupBox('資料庫按鈕')
-
self.group_box_layout = QtWidgets.QVBoxLayout()
-
self.group_box.setLayout(self.group_box_layout)
-
# 建立一個表格部件
-
self.table_widget = QtWidgets.QTableView()
-
# 将上述兩個部件添加到網格布局中
-
self.grid_layout.addWidget(self.group_box,0,0)
-
self.grid_layout.addWidget(self.table_widget,0,1)
-
# 建立按鈕組的按鈕
-
self.b_create_db = QtWidgets.QPushButton("建立資料庫")
-
self.b_create_db.clicked.connect(self.create_db)
-
self.b_view_data = QtWidgets.QPushButton("浏覽資料")
-
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界面如下圖所示:
連接配接一個資料庫
在上面建立的UI界面中,我們有一個“建立資料庫”的按鈕,這個按鈕我們用來建立一個資料庫連接配接。
Qt中内置了好幾個資料庫的驅動程式,也就是說我們可以直接在PyQt中對這些資料庫進行操作。這些内置的資料庫包括:
● IBM DB2,驅動名為QDB2;
● Borland InterBase,驅動名為QIBASE;
● MySQL,驅動名為QMYSQL;
● Oracle,驅動名為QOCI;
● Microsoft SQL Server和其他符合ODBC的資料庫,驅動名為QODBC;
● PostgreSQL,驅動名為QPSQL;
● SQLite2,驅動名為QSQLITE2;
● SQLite3,驅動名為QSQLITE;
通過這些驅動名,我們可以借助QSqlDatabase類的addDatabase方法添加某個資料庫的連接配接,比如建立一個MySQL資料庫的連接配接為:
-
db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
-
db.setHostName('主機名')
-
db.setDatabaseName('資料庫名')
-
db.setUserName('使用者名')
-
db.setPassword('密碼')
-
db.open()
為了友善示範,在此我們使用Sqlite資料庫。
在MainUi()類中,我們建立一個名為create_db()的方法:
-
# 建立資料庫
-
def create_db(self):
-
try:
-
# 調用輸入框擷取資料庫名稱
-
db_text,db_action = QtWidgets.QInputDialog.getText(self,'資料庫名稱','請輸入資料庫名稱',QtWidgets.QLineEdit.Normal)
-
if (db_text.replace(' ','') != '') and (db_action is True):
-
print(db_text)
-
self.db_name = db_text
-
# 添加一個sqlite資料庫連接配接并打開
-
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
-
db.setDatabaseName('{}.sqlite'.format(db_text))
-
db.open()
-
# 執行個體化一個查詢對象
-
query = QtSql.QSqlQuery()
-
# 建立一個資料庫表
-
query.exec_("create table zmister(ID int primary key, "
-
"site_name varchar(20), site_url varchar(100))")
-
# 插入三條資料
-
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('建立資料庫成功')
-
except Exception as e:
-
print(e)
在這個方法中,我們自定義資料庫名并建立一個sqlite資料庫,然後在這個資料庫中建立了一個名為zmister的資料庫表,最後在zmister資料庫表中插入了三條資料。
接下來,我們将這個方法綁定到【建立資料庫】按鈕的點選事件上:
-
self.b_create_db.clicked.connect(self.create_db)
這樣,當我們點選【建立資料庫】按鈕的時候,UI界面會彈出一個文本輸入框供我們輸入資料庫的名稱,然後建立一個資料表并插入資料:
完成操作之後,會發現檔案同級目錄下多出了一個zmister.sqlite檔案,我們使用SQLite Expert等SQLite資料庫可視化軟體打開它:
這樣,我們就成功在PyQt5中建立連接配接并寫入操作了一個資料庫。
在UI界面檢視和修改資料
上面我們建立了一個SQLite資料庫并在其中寫入了三條資料,如何将資料表中的資料顯示在UI界面中呢。我們可以借助QSqlTableModel類來實作。
還記得我們在建立UI界面的時候,在界面的右方放置了一個QTableView()部件,我們的資料庫資料将顯示在這上面。
繼續在MainUi()類中建立一個名為view_data()的方法,在方法中執行個體化一個QSqlTableModel(),并将QTableView()部件的model模型設定為執行個體化後的QSqlTableModel():
-
# 浏覽資料
-
def view_data(self):
-
# 執行個體化一個可編輯資料模型
-
self.model = QtSql.QSqlTableModel()
-
self.table_widget.setModel(self.model)
-
self.model.setTable('zmister') # 設定資料模型的資料表
-
self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) # 允許字段更改
-
self.model.select() # 查詢所有資料
-
# 設定表格頭
-
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界面的【浏覽資料】按鈕的點選事件中:
-
self.b_view_data.clicked.connect(self.view_data)
這樣,我們在點選【浏覽資料】按鈕的時候,會将zmister表中的所有資料顯示出來:
除了簡單的将資料顯示在UI界面上,我們還可以直接在UI界面上修改資料:
添加和删除資料
完成查和改的SQL操作之後,我們接着來了解一下如何添加資料和删除資料。
添加資料通過資料模型對象的insertRows()方法來實作,删除資料則通過資料模型對象的removeRow()方法來實作。
我們繼續在MainUi()類中建立兩個方法:addrowdata()和delrowdata():
-
# 添加一行資料行
-
def add_row_data(self):
-
# 如果存在執行個體化的資料模型對象
-
if self.model:
-
self.model.insertRows(self.model.rowCount(), 1)
-
else:
-
self.create_db()
-
# 删除一行資料
-
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)
這樣就實作了UI界面上的添加資料和删除資料:
原文釋出時間為:2018-11-19本文作者:州的先生本文來自雲栖社群合作夥伴“
Python愛好者社群”,了解相關資訊可以關注“
”。