PyQt5 - Xử lý cơ sở dữ liệu

Thư viện PyQt5 chứa QtSqlmô-đun. Nó là một hệ thống lớp phức tạp để giao tiếp với nhiều cơ sở dữ liệu dựa trên SQL. Nó làQSqlDatabasecung cấp quyền truy cập thông qua một đối tượng Connection. Sau đây là danh sách các trình điều khiển SQL hiện có sẵn:

Sr.No. Loại & Mô tả Trình điều khiển
1

QDB2

IBM DB2

2

QIBASE

Trình điều khiển Borland InterBase

3

QMYSQL

Trình điều khiển MySQL

4

QOCI

Trình điều khiển giao diện cuộc gọi Oracle

5

QODBC

Trình điều khiển ODBC (bao gồm Microsoft SQL Server)

6

QPSQL

Trình điều khiển PostgreSQL

7

QSQLITE

SQLite phiên bản 3 trở lên

số 8

QSQLITE2

SQLite phiên bản 2

Thí dụ

Đối với chương này, kết nối với cơ sở dữ liệu SQLite được thiết lập bằng phương pháp tĩnh -

db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')

Các phương thức khác của lớp QSqlDatabase như sau:

Sr.No. Phương pháp & Mô tả
1

setDatabaseName()

Đặt tên của cơ sở dữ liệu mà kết nối được tìm kiếm

2

setHostName()

Đặt tên của máy chủ lưu trữ mà cơ sở dữ liệu được cài đặt

3

setUserName()

Chỉ định tên người dùng cho kết nối

4

setPassword()

Đặt mật khẩu của đối tượng kết nối nếu có

5

commit()

Cam kết các giao dịch và trả về đúng sự thật nếu thành công

6

rollback()

Cuộn lại giao dịch cơ sở dữ liệu

7

close()

Đóng kết nối

QSqlQuerylớp có chức năng thực thi và thao tác các lệnh SQL. Cả hai kiểu truy vấn SQL DDL và DML đều có thể được thực thi. Bước đầu tiên là tạo cơ sở dữ liệu SQlite bằng các câu lệnh sau:

db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')

Tiếp theo, lấy đối tượng Truy vấn với QSqlQuery() và gọi phương thức quan trọng nhất của nó là execute_ (), phương thức này nhận làm đối số là một chuỗi chứa câu lệnh SQL sẽ được thực thi.

query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))")

Tập lệnh sau tạo cơ sở dữ liệu SQLite sports.db với một bảng vận động viên điền vào năm bản ghi.

import sys
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def createDB():
   db = QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sportsdatabase.db')

   if not db.open():
      msg = QMessageBox()
      msg.setIcon(QMessageBox.Critical)
      msg.setText("Error in Database Creation")
      retval = msg.exec_()
      return False
   query = QSqlQuery()

   query.exec_("create table sportsmen(
      id int primary key, ""firstname varchar(20), lastname varchar(20))")

   query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
   query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
   query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
   query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
   query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
   return True

if __name__ == '__main__':
   app = QApplication(sys.argv)
   createDB()

Để xác nhận rằng cơ sở dữ liệu SQLite được tạo với các bản ghi ở trên được thêm vào bảng sportsmen trong đó, hãy sử dụng tiện ích SQLite Gui được gọi là SQLiteStudio.

QSqlTableModelclass trong PyQt là một giao diện cấp cao cung cấp mô hình dữ liệu có thể chỉnh sửa để đọc và ghi các bản ghi trong một bảng. Mô hình này được sử dụng để điềnQTableViewvật. Nó trình bày cho người dùng một chế độ xem có thể cuộn và chỉnh sửa được có thể được đặt trên bất kỳ cửa sổ cấp cao nhất nào.

Đối tượng QSqlTableModel được khai báo theo cách sau:

model = QtSql.QSqlTableModel()

Chiến lược chỉnh sửa của nó có thể được đặt thành bất kỳ điều nào sau đây:

QSqlTableModel.OnFieldChange Mọi thay đổi sẽ được áp dụng ngay lập tức
QSqlTableModel.OnRowChange Các thay đổi sẽ được áp dụng khi người dùng chọn một hàng khác
QSqlTableModel.OnManualSubmit Tất cả các thay đổi sẽ được lưu vào bộ nhớ cache cho đến khi submitAll () hoặc revertAll () được gọi

Thí dụ

Trong ví dụ sau, bảng vận động viên được sử dụng làm mô hình và chiến lược được đặt là:

model.setTable('sportsmen') 
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
   model.select()

Lớp QTableView là một phần của khuôn khổ Model / View trong PyQt. Đối tượng QTableView được tạo như sau:

view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view

Đối tượng QTableView này và hai widget QPushButton được thêm vào cửa sổ QDialog cấp cao nhất. Tín hiệu clicked () của nút add được kết nối với addrow () thực hiện insertRow () trên bảng mô hình.

button.clicked.connect(addrow)
def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

Vị trí được liên kết với nút xóa thực hiện một hàm lambda để xóa một hàng, được người dùng chọn.

btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))

Mã hoàn chỉnh như sau:

import sys
from PyQt5.QtSql import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def initializeModel(model):
   model.setTable('sportsmen')
   model.setEditStrategy(QSqlTableModel.OnFieldChange)
   model.select()
   model.setHeaderData(0, Qt.Horizontal, "ID")
   model.setHeaderData(1, Qt.Horizontal, "First name")
   model.setHeaderData(2, Qt.Horizontal, "Last name")

def createView(title, model):
   view = QTableView()
   view.setModel(model)
   view.setWindowTitle(title)
   return view

def addrow():
   print (model.rowCount())
   ret = model.insertRows(model.rowCount(), 1)
   print (ret)

def findrow(i):
   delrow = i.row()

if __name__ == '__main__':
   app = QApplication(sys.argv)
   db = QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sportsdatabase.db')
   model = QSqlTableModel()
   delrow = -1
   initializeModel(model)

   view1 = createView("Table Model (View 1)", model)
   view1.clicked.connect(findrow)

   dlg = QDialog()
   layout = QVBoxLayout()
   layout.addWidget(view1)

   button = QPushButton("Add a row")
   button.clicked.connect(addrow)
   layout.addWidget(button)

   btn1 = QPushButton("del a row")
   btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
   layout.addWidget(btn1)

   dlg.setLayout(layout)
   dlg.setWindowTitle("Database Demo")
   dlg.show()
   sys.exit(app.exec_())

Đoạn mã trên tạo ra kết quả sau:

Hãy thử thêm và xóa một vài bản ghi và quay lại SQLiteStudio để xác nhận các giao dịch.