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.