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.