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

API PyQt chứa 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. QSqlDatabase của nó cung 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ụ

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

Lớp QSqlQuery 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. Phương thức quan trọng nhất trong lớp 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 đượ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.

from PyQt4 import QtSql, QtGui

def createDB():
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')
	
   if not db.open():
      QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
         QtGui.qApp.tr("Unable to establish a database connection.\n"
            "This example needs SQLite support. Please read "
            "the Qt SQL driver documentation for information "
            "how to build it.\n\n" "Click Cancel to exit."),
         QtGui.QMessageBox.Cancel)
			
      return False
		
   query = QtSql.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__':
   import sys
	
   app = QtGui.QApplication(sys.argv)
   createDB()

Lớp QSqlTableModel 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ền một đối tượng QTableView. 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 QTableModel đượ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 PyQt4 import QtCore, QtGui, QtSql
import sportsconnection

def initializeModel(model):
   model.setTable('sportsmen')
   model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
   model.select()
   model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
   model.setHeaderData(1, QtCore.Qt.Horizontal, "First name")
   model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name")
	
def createView(title, model):
   view = QtGui.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 = QtGui.QApplication(sys.argv)
   db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
   db.setDatabaseName('sports.db')
   model = QtSql.QSqlTableModel()
   delrow = -1
   initializeModel(model)
	
   view1 = createView("Table Model (View 1)", model)
   view1.clicked.connect(findrow)
	
   dlg = QtGui.QDialog()
   layout = QtGui.QVBoxLayout()
   layout.addWidget(view1)
	
   button = QtGui.QPushButton("Add a row")
   button.clicked.connect(addrow)
   layout.addWidget(button)
	
   btn1 = QtGui.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: