PyQt5 - Penanganan Database
Pustaka PyQt5 berisi QtSqlmodul. Ini adalah sistem kelas yang rumit untuk berkomunikasi dengan banyak database berbasis SQL. NyaQSqlDatabasemenyediakan akses melalui objek Connection. Berikut adalah daftar driver SQL yang tersedia saat ini -
Sr.No. | Jenis & Deskripsi Driver |
---|---|
1 | QDB2 IBM DB2 |
2 | QIBASE Pengemudi Borland InterBase |
3 | QMYSQL Driver MySQL |
4 | QOCI Driver Antarmuka Panggilan Oracle |
5 | QODBC Driver ODBC (termasuk Microsoft SQL Server) |
6 | QPSQL Driver PostgreSQL |
7 | QSQLITE SQLite versi 3 atau lebih tinggi |
8 | QSQLITE2 SQLite versi 2 |
Contoh
Untuk bab ini, koneksi dengan database SQLite dibuat menggunakan metode statis -
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
Metode lain dari kelas QSqlDatabase adalah sebagai berikut -
Sr.No. | Metode & Deskripsi |
---|---|
1 | setDatabaseName() Menetapkan nama database yang dicari koneksi |
2 | setHostName() Menetapkan nama host tempat database diinstal |
3 | setUserName() Menentukan nama pengguna untuk koneksi |
4 | setPassword() Setel kata sandi objek koneksi jika ada |
5 | commit() Melakukan transaksi dan mengembalikan nilai true jika berhasil |
6 | rollback() Mengembalikan transaksi database |
7 | close() Tutup koneksi |
QSqlQuerykelas memiliki fungsionalitas untuk menjalankan dan memanipulasi perintah SQL. Baik jenis kueri SQL DDL dan DML dapat dijalankan. Langkah pertama adalah membuat database SQlite menggunakan pernyataan berikut -
db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sportsdatabase.db')
Selanjutnya, dapatkan objek Query dengan QSqlQuery() metode dan memanggil metode yang paling penting exec_ (), yang mengambil argumen string yang berisi pernyataan SQL untuk dieksekusi.
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))")
Skrip berikut membuat database SQLite sports.db dengan tabel olahragawan yang diisi dengan lima catatan.
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()
Untuk mengonfirmasi bahwa database SQLite dibuat dengan catatan di atas ditambahkan dalam tabel olahragawan di dalamnya, gunakan utilitas SQLite Gui yang disebut SQLiteStudio.
QSqlTableModelkelas di PyQt adalah antarmuka tingkat tinggi yang menyediakan model data yang dapat diedit untuk membaca dan menulis catatan dalam satu tabel. Model ini digunakan untuk mengisi fileQTableViewobyek. Ini menyajikan kepada pengguna tampilan yang dapat digulir dan diedit yang dapat diletakkan di jendela tingkat atas apa pun.
Objek QSqlTableModel dideklarasikan dengan cara berikut -
model = QtSql.QSqlTableModel()
Strategi pengeditannya dapat diatur ke salah satu dari berikut ini -
QSqlTableModel.OnFieldChange | Semua perubahan akan segera diterapkan |
---|---|
QSqlTableModel.OnRowChange | Perubahan akan diterapkan saat pengguna memilih baris yang berbeda |
QSqlTableModel.OnManualSubmit | Semua perubahan akan di-cache sampai submitAll () atau revertAll () dipanggil |
Contoh
Dalam contoh berikut, tabel olahragawan digunakan sebagai model dan strateginya ditetapkan sebagai -
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
Kelas QTableView adalah bagian dari kerangka Model / View di PyQt. Objek QTableView dibuat sebagai berikut -
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
Objek QTableView dan dua widget QPushButton ini ditambahkan ke jendela QDialog tingkat atas. Sinyal clicked () dari tombol add terhubung ke addrow () yang melakukan insertRow () pada tabel model.
button.clicked.connect(addrow)
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
Slot yang terkait dengan tombol hapus menjalankan fungsi lambda yang menghapus baris, yang dipilih oleh pengguna.
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
Kode lengkapnya adalah sebagai berikut -
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_())
Kode di atas menghasilkan keluaran sebagai berikut -
Coba tambahkan dan hapus beberapa catatan dan kembali ke SQLiteStudio untuk mengonfirmasi transaksi.