天天看點

如虎添翼!在PyQt5中便捷的進行資料庫操作!

在桌面圖像化界面程式設計中,我們通常需要将一些資料或配置資訊存儲在本地。在本地進行資料的存儲,我們可以直接使用文本檔案,比如ini檔案、csv檔案、json檔案等,或者是使用檔案型的資料庫(比如sqlit3)進行存儲。

PyQt5的SQL資料庫支援

Qt平台對SQL程式設計有着良好的支援,PyQt5也一并繼承了過來。在PyQt5中,QtSql子子產品提供對SQL資料庫的支援:

如虎添翼!在PyQt5中便捷的進行資料庫操作!

從上圖我們可以發現,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界面的代碼如下所示:

  1. # coding:utf-8

  2. from PyQt5 import QtGui,QtCore,QtWidgets,QtSql

  3. import sys

  4. '''

  5. 州的先生 - 在PyQt5中使用資料庫

  6. '''

  7. class MainUi(QtWidgets.QMainWindow):

  8. def __init__(self):

  9. super().__init__()

  10. self.initUi()

  11. # 初始化UI界面

  12. def initUi(self):

  13. # 設定視窗标題

  14. self.setWindowTitle("州的先生 - 在PyQt5中使用資料庫")

  15. # 設定視窗大小

  16. self.resize(600,400)

  17. # 建立一個視窗部件

  18. self.widget = QtWidgets.QWidget()

  19. # 建立一個網格布局

  20. self.grid_layout = QtWidgets.QGridLayout()

  21. # 設定視窗部件的布局為網格布局

  22. self.widget.setLayout(self.grid_layout)

  23. # 建立一個按鈕組

  24. self.group_box = QtWidgets.QGroupBox('資料庫按鈕')

  25. self.group_box_layout = QtWidgets.QVBoxLayout()

  26. self.group_box.setLayout(self.group_box_layout)

  27. # 建立一個表格部件

  28. self.table_widget = QtWidgets.QTableView()

  29. # 将上述兩個部件添加到網格布局中

  30. self.grid_layout.addWidget(self.group_box,0,0)

  31. self.grid_layout.addWidget(self.table_widget,0,1)

  32. # 建立按鈕組的按鈕

  33. self.b_create_db = QtWidgets.QPushButton("建立資料庫")

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

  35. self.b_view_data = QtWidgets.QPushButton("浏覽資料")

  36. self.b_add_row = QtWidgets.QPushButton("添加一行")

  37. self.b_delete_row = QtWidgets.QPushButton("删除一行")

  38. self.b_close = QtWidgets.QPushButton("退出")

  39. self.b_close.clicked.connect(self.close)

  40. # 添加按鈕到按鈕組中

  41. self.group_box_layout.addWidget(self.b_create_db)

  42. self.group_box_layout.addWidget(self.b_view_data)

  43. self.group_box_layout.addWidget(self.b_add_row)

  44. self.group_box_layout.addWidget(self.b_delete_row)

  45. self.group_box_layout.addWidget(self.b_close)

  46. # 設定UI界面的核心部件

  47. self.setCentralWidget(self.widget)

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

如虎添翼!在PyQt5中便捷的進行資料庫操作!

連接配接一個資料庫

在上面建立的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資料庫的連接配接為:

  1. db = QtSql.QSqlDatabase.addDatabase('QMYSQL')

  2. db.setHostName('主機名')

  3. db.setDatabaseName('資料庫名')

  4. db.setUserName('使用者名')

  5. db.setPassword('密碼')

  6. db.open()

為了友善示範,在此我們使用Sqlite資料庫。

在MainUi()類中,我們建立一個名為create_db()的方法:

  1. # 建立資料庫

  2. def create_db(self):

  3. try:

  4. # 調用輸入框擷取資料庫名稱

  5. db_text,db_action = QtWidgets.QInputDialog.getText(self,'資料庫名稱','請輸入資料庫名稱',QtWidgets.QLineEdit.Normal)

  6. if (db_text.replace(' ','') != '') and (db_action is True):

  7. print(db_text)

  8. self.db_name = db_text

  9. # 添加一個sqlite資料庫連接配接并打開

  10. db = QtSql.QSqlDatabase.addDatabase('QSQLITE')

  11. db.setDatabaseName('{}.sqlite'.format(db_text))

  12. db.open()

  13. # 執行個體化一個查詢對象

  14. query = QtSql.QSqlQuery()

  15. # 建立一個資料庫表

  16. query.exec_("create table zmister(ID int primary key, "

  17. "site_name varchar(20), site_url varchar(100))")

  18. # 插入三條資料

  19. query.exec_("insert into zmister values(1000, '州的先生', 'https://zmister.com')")

  20. query.exec_("insert into zmister values(1001, '百度', 'http://www.baidu.com')")

  21. query.exec_("insert into zmister values(1002, '騰訊', 'http://www.qq.com')")

  22. print('建立資料庫成功')

  23. except Exception as e:

  24. print(e)

在這個方法中,我們自定義資料庫名并建立一個sqlite資料庫,然後在這個資料庫中建立了一個名為zmister的資料庫表,最後在zmister資料庫表中插入了三條資料。

接下來,我們将這個方法綁定到【建立資料庫】按鈕的點選事件上:

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

這樣,當我們點選【建立資料庫】按鈕的時候,UI界面會彈出一個文本輸入框供我們輸入資料庫的名稱,然後建立一個資料表并插入資料:

如虎添翼!在PyQt5中便捷的進行資料庫操作!

完成操作之後,會發現檔案同級目錄下多出了一個zmister.sqlite檔案,我們使用SQLite Expert等SQLite資料庫可視化軟體打開它:

如虎添翼!在PyQt5中便捷的進行資料庫操作!

這樣,我們就成功在PyQt5中建立連接配接并寫入操作了一個資料庫。

在UI界面檢視和修改資料

上面我們建立了一個SQLite資料庫并在其中寫入了三條資料,如何将資料表中的資料顯示在UI界面中呢。我們可以借助QSqlTableModel類來實作。

還記得我們在建立UI界面的時候,在界面的右方放置了一個QTableView()部件,我們的資料庫資料将顯示在這上面。

繼續在MainUi()類中建立一個名為view_data()的方法,在方法中執行個體化一個QSqlTableModel(),并将QTableView()部件的model模型設定為執行個體化後的QSqlTableModel():

  1. # 浏覽資料

  2. def view_data(self):

  3. # 執行個體化一個可編輯資料模型

  4. self.model = QtSql.QSqlTableModel()

  5. self.table_widget.setModel(self.model)

  6. self.model.setTable('zmister') # 設定資料模型的資料表

  7. self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) # 允許字段更改

  8. self.model.select() # 查詢所有資料

  9. # 設定表格頭

  10. self.model.setHeaderData(0,QtCore.Qt.Horizontal,'ID')

  11. self.model.setHeaderData(1, QtCore.Qt.Horizontal, '站點名稱')

  12. self.model.setHeaderData(2, QtCore.Qt.Horizontal, '站點位址')

然後,将view_data()方法綁定在UI界面的【浏覽資料】按鈕的點選事件中:

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

這樣,我們在點選【浏覽資料】按鈕的時候,會将zmister表中的所有資料顯示出來:

如虎添翼!在PyQt5中便捷的進行資料庫操作!

除了簡單的将資料顯示在UI界面上,我們還可以直接在UI界面上修改資料:

如虎添翼!在PyQt5中便捷的進行資料庫操作!

添加和删除資料

完成查和改的SQL操作之後,我們接着來了解一下如何添加資料和删除資料。

添加資料通過資料模型對象的insertRows()方法來實作,删除資料則通過資料模型對象的removeRow()方法來實作。

我們繼續在MainUi()類中建立兩個方法:addrowdata()和delrowdata():

  1. # 添加一行資料行

  2. def add_row_data(self):

  3. # 如果存在執行個體化的資料模型對象

  4. if self.model:

  5. self.model.insertRows(self.model.rowCount(), 1)

  6. else:

  7. self.create_db()

  8. # 删除一行資料

  9. def del_row_data(self):

  10. if self.model:

  11. self.model.removeRow(self.table_widget.currentIndex().row())

  12. else:

  13. self.create_db()

然後将這兩個方法分别綁定在【添加一行】和【删除一行】按鈕的點選事件上:

  1. self.b_add_row.clicked.connect(self.add_row_data)

  2. self.b_delete_row.clicked.connect(self.del_row_data)

這樣就實作了UI界面上的添加資料和删除資料:

如虎添翼!在PyQt5中便捷的進行資料庫操作!

原文釋出時間為:2018-11-19本文作者:州的先生本文來自雲栖社群合作夥伴“

Python愛好者社群

”,了解相關資訊可以關注“

”。