Python GUI教程之在PyQt5中使用數據庫的方法
在桌面圖像化界面編程中,我們通常需要將一些數據或配置信息存儲在本地。在本地進行數據的存儲,我們可以直接使用文本文件,比如ini文件、csv文件、json文件等,或者是使用文件型的數據庫(比如sqlit3)進行存儲。
PyQt5的SQL數據庫支持
Qt平臺對SQL編程有著良好的支持,PyQt5也一并繼承了過來。在PyQt5中,QtSql子模塊提供對SQL數據庫的支持:
從上圖我們可以發(fā)現,QtSQL模塊中包含了很多個類,這些類歸總起來主要包含三大部分:
- 驅動層,用于提供特定數據庫與SQL API接口之間的低級連接功能;其中包括QSqlDriver、QSqlDriverCreatorBase、QSqlResult;
- SQL API層,用于提供對數據庫的訪問。通常來說,我們會使用QSqlDatabase建立數據庫連接,使用QSqlQuery等類實現數據庫的交互(執(zhí)行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:執(zhí)行和操作SQL語句的方法
- QSqlQueryModel:SQL結果集的只讀數據模型
- QSqlRecord:封裝數據庫記錄
- QSqlRelationalTableModel:具有外鍵支持的單個數據庫表的可編輯數據模型
- QSqlResult:用于從特定SQL數據庫訪問數據的抽象接口
- QSqlTableModel:單個數據庫表的可編輯數據模型
在實際的PyQt編程中,我們很少使用驅動層的類,多通過API層的來建立數據庫連接、進行數據庫查詢等,然后通過用戶界面操作層的類將數據結果顯示在圖形界面中。下面我們就來簡單使用一下。
在PyQt5中簡單使用數據庫
創(chuàng)建一個UI界面
首先,我們通過PyQt5創(chuàng)建一個基本的圖形界面。這個界面由兩個部分組成:
- 按鈕操作層:用來通過按鈕進行數據庫操作;
- 數據庫展示層:用來展示數據庫表的信息;
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) # 創(chuàng)建一個窗口部件 self.widget = QtWidgets.QWidget() # 創(chuàng)建一個網格布局 self.grid_layout = QtWidgets.QGridLayout() # 設置窗口部件的布局為網格布局 self.widget.setLayout(self.grid_layout) # 創(chuàng)建一個按鈕組 self.group_box = QtWidgets.QGroupBox('數據庫按鈕') self.group_box_layout = QtWidgets.QVBoxLayout() self.group_box.setLayout(self.group_box_layout) # 創(chuàng)建一個表格部件 self.table_widget = QtWidgets.QTableView() # 將上述兩個部件添加到網格布局中 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)建數據庫") 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界面如下圖所示:
連接一個數據庫
在上面創(chuàng)建的UI界面中,我們有一個“創(chuàng)建數據庫”的按鈕,這個按鈕我們用來建立一個數據庫連接。
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()類中,我們創(chuàng)建一個名為create_db()的方法:
# 創(chuàng)建數據庫 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() # 創(chuàng)建一個數據庫表 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('創(chuàng)建數據庫成功') except Exception as e: print(e)
在這個方法中,我們自定義數據庫名并創(chuàng)建一個sqlite數據庫,然后在這個數據庫中創(chuàng)建了一個名為zmister的數據庫表,最后在zmister數據庫表中插入了三條數據。
接下來,我們將這個方法綁定到【創(chuàng)建數據庫】按鈕的點擊事件上:
self.b_create_db.clicked.connect(self.create_db)
這樣,當我們點擊【創(chuàng)建數據庫】按鈕的時候,UI界面會彈出一個文本輸入框供我們輸入數據庫的名稱,然后創(chuàng)建一個數據表并插入數據:
完成操作之后,會發(fā)現文件同級目錄下多出了一個zmister.sqlite文件,我們使用SQLite Expert等SQLite數據庫可視化軟件打開它:
這樣,我們就成功在PyQt5中創(chuàng)建連接并寫入操作了一個數據庫。
在UI界面查看和修改數據
上面我們創(chuàng)建了一個SQLite數據庫并在其中寫入了三條數據,如何將數據表中的數據顯示在UI界面中呢。我們可以借助QSqlTableModel類來實現。
還記得我們在創(chuàng)建UI界面的時候,在界面的右方放置了一個QTableView()部件,我們的數據庫數據將顯示在這上面。
繼續(xù)在MainUi()類中創(chuàng)建一個名為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()方法來實現。
我們繼續(xù)在MainUi()類中創(chuàng)建兩個方法:add_row_data()和del_row_data():
# 添加一行數據行 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界面上的添加數據和刪除數據:
這樣,我們就基本實現了使用PyQt5對數據庫的增刪改查操作,更加詳細的使用和說明請參考Qt文檔。
到此這篇關于Python GUI教程之在PyQt5中使用數據庫的方法的文章就介紹到這了,更多相關PyQt5使用數據庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python+pygame實現坦克大戰(zhàn)小游戲的示例代碼(可以自定義子彈速度)
這篇文章主要介紹了python+pygame實現坦克大戰(zhàn)小游戲---可以自定義子彈速度,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08對python中raw_input()和input()的用法詳解
下面小編就為大家分享一篇對python中raw_input()和input()的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04