Persistensi Data Python - Modul Sqlite3

Salah satu kelemahan utama file CSV, JSON, XML, dll., Adalah file tersebut tidak terlalu berguna untuk akses acak dan pemrosesan transaksi karena sebagian besar tidak terstruktur. Karenanya, menjadi sangat sulit untuk mengubah isinya.

File datar ini tidak cocok untuk lingkungan klien-server karena mereka tidak memiliki kemampuan pemrosesan asinkron. Menggunakan file data yang tidak terstruktur menyebabkan redundansi dan inkonsistensi data.

Masalah tersebut dapat diatasi dengan menggunakan database relasional. Database adalah kumpulan data yang terorganisir untuk menghilangkan redundansi dan inkonsistensi, serta menjaga integritas data. Model database relasional sangat populer.

Konsep dasarnya adalah menyusun data dalam tabel entitas (disebut relasi). Struktur tabel entitas menyediakan satu atribut yang nilainya unik untuk setiap baris. Atribut seperti itu disebut'primary key'.

Ketika kunci utama dari satu tabel muncul dalam struktur tabel lainnya, itu disebut 'Foreign key'dan ini menjadi dasar hubungan antara keduanya. Berdasarkan model ini, ada banyak produk RDBMS populer yang tersedia saat ini -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

SQLite adalah database relasional ringan yang digunakan dalam berbagai macam aplikasi. Ini adalah mesin database SQL transaksional, tanpa server, tanpa konfigurasi, dan mandiri. Seluruh database adalah satu file, yang dapat ditempatkan di mana saja di sistem file. Ini adalah perangkat lunak sumber terbuka, dengan footprint yang sangat kecil, dan konfigurasi nol. Ini populer digunakan di perangkat tertanam, IOT dan aplikasi seluler.

Semua database relasional menggunakan SQL untuk menangani data dalam tabel. Namun sebelumnya, masing-masing database ini dulunya terhubung dengan aplikasi Python dengan bantuan modul Python yang dikhususkan untuk jenis database.

Oleh karena itu, ada kekurangan kompatibilitas di antara mereka. Jika pengguna ingin mengubah ke produk database yang berbeda, itu akan terbukti sulit. Masalah ketidakcocokan ini diatasi dengan memunculkan 'Python Enhancement Proposal (PEP 248)' untuk merekomendasikan antarmuka yang konsisten ke database relasional yang dikenal sebagai DB-API. Rekomendasi terbaru dipanggilDB-APIVersi 2.0. (PEP 249)

Pustaka standar Python terdiri dari modul sqlite3 yang merupakan modul yang sesuai dengan DB-API untuk menangani database SQLite melalui program Python. Bab ini menjelaskan konektivitas Python dengan database SQLite.

Seperti yang disebutkan sebelumnya, Python memiliki dukungan bawaan untuk database SQLite dalam bentuk modul sqlite3. Untuk database lain, modul Python yang sesuai dengan DB-API harus diinstal dengan bantuan utilitas pip. Misalnya, untuk menggunakan database MySQL kita perlu menginstal modul PyMySQL.

pip install pymysql

Langkah-langkah berikut direkomendasikan dalam DB-API -

  • Buat koneksi dengan database menggunakan connect() berfungsi dan mendapatkan objek koneksi.

  • Panggilan cursor() metode objek koneksi untuk mendapatkan objek kursor.

  • Bentuk string kueri yang terdiri dari pernyataan SQL untuk dieksekusi.

  • Jalankan kueri yang diinginkan dengan memanggil execute() metode.

  • Tutup koneksi.

import sqlite3
db=sqlite3.connect('test.db')

Di sini, db adalah objek koneksi yang mewakili test.db. Perhatikan, database itu akan dibuat jika belum ada. Objek koneksi db memiliki metode berikut -

Sr.No. Metode & Deskripsi
1

cursor():

Mengembalikan objek Cursor yang menggunakan Koneksi ini.

2

commit():

Secara eksplisit melakukan transaksi yang tertunda ke database.

3

rollback():

Metode opsional ini menyebabkan transaksi digulung kembali ke titik awal.

4

close():

Menutup koneksi ke database secara permanen.

Kursor bertindak sebagai pegangan untuk kueri SQL tertentu yang memungkinkan pengambilan satu atau beberapa baris hasil. Objek kursor diperoleh dari koneksi untuk mengeksekusi kueri SQL menggunakan pernyataan berikut -

cur=db.cursor()

Objek kursor memiliki metode berikut yang ditentukan -

Sr Tidak Metode & Deskripsi
1

execute()

Menjalankan kueri SQL dalam parameter string.

2

executemany()

Menjalankan kueri SQL menggunakan satu set parameter dalam daftar tupel.

3

fetchone()

Mengambil baris berikutnya dari kumpulan hasil kueri.

4

fetchall()

Mengambil semua baris yang tersisa dari kumpulan hasil kueri.

5

callproc()

Memanggil prosedur tersimpan.

6

close()

Menutup objek kursor.

Kode berikut membuat tabel di test.db: -

import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()

Integritas data yang diinginkan dalam database tercapai dengan commit() dan rollback()metode objek koneksi. String kueri SQL mungkin memiliki kueri SQL yang salah yang dapat menimbulkan pengecualian, yang harus ditangani dengan benar. Untuk itu, pernyataan execute () ditempatkan di dalam blok try. Jika berhasil, hasilnya disimpan secara persisten menggunakan metode commit (). Jika kueri gagal, transaksi dibatalkan menggunakan metode rollback ().

Kode berikut mengeksekusi query INSERT pada tabel siswa di test.db.

import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
   cur=db.cursor()
   cur.execute(qry)
   db.commit()
print ("record added successfully")
except:
   print ("error in query")
   db.rollback()
db.close()

Jika Anda ingin data dalam klausul nilai dari kueri INSERT disediakan secara dinamis oleh input pengguna, gunakan substitusi parameter seperti yang direkomendasikan dalam Python DB-API. Itu? karakter digunakan sebagai placeholder dalam string kueri dan memberikan nilai dalam bentuk tupel dalam metode execute (). Contoh berikut menyisipkan record menggunakan metode substitusi parameter. Nama, umur dan tanda diambil sebagai masukan.

import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,a,m))
   db.commit()
   print ("one record added successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

Modul sqlite3 mendefinisikan The executemany()metode yang mampu menambahkan beberapa record sekaligus. Data yang akan ditambahkan harus diberikan dalam daftar tupel, dengan setiap tupel berisi satu catatan. Objek daftar adalah parameter metode executemany (), bersama dengan string kueri. Namun, metode executemany () tidak didukung oleh beberapa modul lainnya.

Itu UPDATEquery biasanya berisi ekspresi logis yang ditentukan oleh klausa WHERE. String kueri dalam metode execute () harus berisi sintaks query UPDATE. Untuk mengupdate nilai 'age' menjadi 23 untuk name = 'Anil', tentukan string seperti di bawah ini:

qry="update student set age=23 where name='Anil';"

Untuk membuat proses pembaruan lebih dinamis, kami menggunakan metode substitusi parameter seperti yang dijelaskan di atas.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (a, nm))
   db.commit()
   print("record updated successfully")
except:
   print("error in query")
   db.rollback()
db.close()

Demikian pula, operasi DELETE dilakukan dengan memanggil metode execute () dengan string yang memiliki sintaks query DELETE SQL. Kebetulan,DELETE query juga biasanya berisi WHERE ayat.

import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
   cur=db.cursor()
   cur.execute(qry, (nm,))
   db.commit()
   print("record deleted successfully")
except:
   print("error in operation")
   db.rollback()
db.close()

Salah satu operasi penting pada tabel database adalah mengambil rekaman darinya. SQL menyediakanSELECTkueri untuk tujuan tersebut. Ketika sebuah string yang berisi sintaks query SELECT diberikan ke metode execute (), objek set hasil dikembalikan. Ada dua metode penting dengan objek kursor yang menggunakan satu atau banyak rekaman dari kumpulan hasil yang dapat diambil.

fetchone ()

Mengambil rekaman yang tersedia berikutnya dari set hasil. Ini adalah tupel yang terdiri dari nilai setiap kolom dari rekaman yang diambil.

fetchall ()

Mengambil semua catatan yang tersisa dalam bentuk daftar tupel. Setiap tupel sesuai dengan satu catatan dan berisi nilai dari setiap kolom dalam tabel.

Contoh berikut mencantumkan semua catatan dalam tabel siswa

import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
   record=cur.fetchone()
   if record==None:
      break
   print (record)
db.close()

Jika Anda berencana menggunakan database MySQL dan bukan database SQLite, Anda perlu menginstal PyMySQLmodul seperti dijelaskan di atas. Semua langkah dalam proses konektivitas database harus sama, karena database MySQL diinstal di server, fungsi connect () memerlukan URL dan kredensial login.

import pymysql
con=pymysql.connect('localhost', 'root', '***')

Satu-satunya hal yang mungkin berbeda dengan SQLite adalah tipe data khusus MySQL. Demikian pula, database yang kompatibel dengan ODBC dapat digunakan dengan Python dengan menginstal modul pyodbc.