Persistensi Data Python - Panduan Cepat

Tinjauan Python - Persistensi Data

Selama menggunakan aplikasi perangkat lunak apa pun, pengguna menyediakan beberapa data untuk diproses. Data dapat dimasukkan, menggunakan perangkat input standar (keyboard) atau perangkat lain seperti file disk, pemindai, kamera, kabel jaringan, koneksi WiFi, dll.

Data yang diterima, disimpan di memori utama (RAM) komputer dalam bentuk berbagai struktur data seperti variabel dan objek hingga aplikasi berjalan. Setelah itu, isi memori dari RAM dihapus.

Namun, lebih sering daripada tidak, yang diinginkan adalah nilai variabel dan / atau objek disimpan sedemikian rupa, sehingga dapat diambil kapanpun diperlukan, daripada memasukkan lagi data yang sama.

Kata 'ketekunan' berarti "kelanjutan akibat setelah penyebabnya dihilangkan". Istilah persistensi data berarti terus ada bahkan setelah aplikasi berakhir. Jadi, data yang disimpan dalam media penyimpanan non-volatile seperti, file disk adalah penyimpanan data yang persisten.

Dalam tutorial ini, kita akan menjelajahi berbagai modul Python bawaan dan pihak ketiga untuk menyimpan dan mengambil data ke / dari berbagai format seperti file teks, file CSV, JSON dan XML serta database relasional dan non-relasional.

Menggunakan objek File bawaan Python, dimungkinkan untuk menulis data string ke file disk dan membacanya. Pustaka standar Python, menyediakan modul untuk menyimpan dan mengambil data serial dalam berbagai struktur data seperti JSON dan XML.

DB-API Python menyediakan cara standar untuk berinteraksi dengan database relasional. Paket Python pihak ketiga lainnya, menghadirkan fungsionalitas antarmuka dengan database NOSQL seperti MongoDB dan Cassandra.

Tutorial ini juga memperkenalkan database ZODB yang merupakan API persistensi untuk objek Python. Format Microsoft Excel adalah format file data yang sangat populer. Dalam tutorial ini, kita akan belajar cara menangani file .xlsx melalui Python.

Python menggunakan built-in input() dan print()berfungsi untuk melakukan operasi input / output standar. Fungsi input () membaca byte dari perangkat aliran input standar, yaitu keyboard.

Itu print()fungsi di sisi lain, mengirimkan data ke perangkat aliran keluaran standar yaitu layar monitor. Program Python berinteraksi dengan perangkat IO ini melalui objek aliran standarstdin dan stdout didefinisikan dalam modul sys.

Itu input()fungsi sebenarnya adalah pembungkus di sekitar metode readline () dari objek sys.stdin. Semua penekanan tombol dari aliran input diterima sampai tombol 'Enter' ditekan.

>>> import sys
>>> x=sys.stdin.readline()
Welcome to TutorialsPoint
>>> x
'Welcome to TutorialsPoint\n'

Perhatikan bahwa, readline()fungsi meninggalkan karakter '\ n' di belakangnya. Ada juga metode read () yang membaca data dari aliran input standar sampai diakhiri olehCtrl+D karakter.

>>> x=sys.stdin.read()
Hello
Welcome to TutorialsPoint
>>> x
'Hello\nWelcome to TutorialsPoint\n'

Demikian pula, print() adalah fungsi kenyamanan yang meniru metode write () dari objek stdout.

>>> x='Welcome to TutorialsPoint\n'
>>> sys.stdout.write(x)
Welcome to TutorialsPoint
26

Sama seperti objek aliran standar stdin dan stdout, program Python dapat membaca data dari dan mengirim data ke file disk atau soket jaringan. Mereka juga aliran. Objek apa pun yang memiliki metode read () adalah aliran input. Setiap objek yang memiliki metode write () adalah aliran keluaran. Komunikasi dengan aliran dibuat dengan mendapatkan referensi ke objek aliran dengan fungsi open () bawaan.

buka () fungsi

Fungsi bawaan ini menggunakan argumen berikut -

f=open(name, mode, buffering)

Parameter nama, adalah nama file disk atau string byte, mode adalah string satu karakter opsional untuk menentukan jenis operasi yang akan dilakukan (baca, tulis, tambahkan, dll.) Dan parameter buffering adalah 0, 1 atau -1 yang menunjukkan buffering tidak aktif, atau default sistem.

Mode pembukaan file disebutkan seperti tabel di bawah ini. Mode default adalah 'r'

Sr Tidak Parameter & Deskripsi
1

R

Terbuka untuk membaca (default)

2

W

Terbuka untuk menulis, memotong file terlebih dahulu

3

X

Buat file baru dan buka untuk menulis

4

A

Terbuka untuk menulis, menambahkan ke akhir file jika ada

5

B

Mode biner

6

T

Mode teks (default)

7

+

Buka file disk untuk memperbarui (membaca dan menulis)

Untuk menyimpan data ke file itu harus dibuka dengan mode 'w'.

f=open('test.txt','w')

Objek file ini bertindak sebagai aliran keluaran, dan memiliki akses ke metode write (). Metode write () mengirim string ke objek ini, dan disimpan dalam file yang mendasari itu.

string="Hello TutorialsPoint\n"
f.write(string)

Penting untuk menutup aliran, untuk memastikan bahwa semua data yang tersisa di buffer sepenuhnya ditransfer ke sana.

file.close()

Coba dan buka 'test.txt' menggunakan editor tes apa pun (seperti notepad) untuk mengonfirmasi pembuatan file yang berhasil.

Untuk membaca konten 'test.txt' secara terprogram, itu harus dibuka dalam mode 'r'.

f=open('test.txt','r')

Objek ini berperilaku sebagai aliran input. Python dapat mengambil data dari aliran menggunakanread() metode.

string=f.read()
print (string)

Isi file ditampilkan di konsol Python. Objek File juga mendukungreadline() metode yang mampu membaca string hingga menemukan karakter EOF.

Namun, jika file yang sama dibuka dalam mode 'w' untuk menyimpan teks tambahan di dalamnya, konten sebelumnya akan dihapus. Setiap kali, file dibuka dengan izin tulis, itu diperlakukan seolah-olah itu adalah file baru. Untuk menambahkan data ke file yang ada, gunakan 'a' untuk mode tambahkan.

f=open('test.txt','a')
f.write('Python Tutorials\n')

File sekarang, memiliki string yang lebih awal dan baru ditambahkan. Objek file juga mendukungwritelines() metode untuk menulis setiap string dalam objek daftar ke file.

f=open('test.txt','a')
lines=['Java Tutorials\n', 'DBMS tutorials\n', 'Mobile development tutorials\n']
f.writelines(lines)
f.close()

Contoh

Itu readlines()metode mengembalikan daftar string, masing-masing mewakili sebuah baris dalam file. Dimungkinkan juga untuk membaca file baris demi baris sampai akhir file tercapai.

f=open('test.txt','r')
while True:
   line=f.readline()
   if line=='' : break
   print (line, end='')
f.close()

Keluaran

Hello TutorialsPoint
Python Tutorials
Java Tutorials
DBMS tutorials
Mobile development tutorials

Mode biner

Secara default, operasi baca / tulis pada objek file dilakukan pada data string teks. Jika kita ingin menangani file dari jenis lain seperti media (mp3), executable (exe), gambar (jpg) dll, kita perlu menambahkan awalan 'b' ke mode baca / tulis.

Pernyataan berikut akan mengubah string menjadi byte dan menulis dalam file.

f=open('test.bin', 'wb')
data=b"Hello World"
f.write(data)
f.close()

Konversi string teks menjadi byte juga dimungkinkan menggunakan fungsi encode ().

data="Hello World".encode('utf-8')

Kita perlu menggunakan ‘rb’mode untuk membaca file biner. Nilai yang dikembalikan dari metode read () pertama kali didekodekan sebelum dicetak.

f=open('test.bin', 'rb')
data=f.read()
print (data.decode(encoding='utf-8'))

Untuk menulis data integer dalam file biner, objek integer harus diubah menjadi byte oleh to_bytes() metode.

n=25
n.to_bytes(8,'big')
f=open('test.bin', 'wb')
data=n.to_bytes(8,'big')
f.write(data)

Untuk membaca kembali dari file biner, ubah output dari fungsi read () menjadi integer dengan fungsi from_bytes ().

f=open('test.bin', 'rb')
data=f.read()
n=int.from_bytes(data, 'big')
print (n)

Untuk data floating point, kita perlu menggunakan struct modul dari pustaka standar Python.

import struct
x=23.50
data=struct.pack('f',x)
f=open('test.bin', 'wb')
f.write(data)

Membuka paket string dari fungsi read (), untuk mengambil data float dari file biner.

f=open('test.bin', 'rb')
data=f.read()
x=struct.unpack('f', data)
print (x)

Baca / tulis secara bersamaan

Ketika sebuah file dibuka untuk ditulis (dengan 'w' atau 'a'), itu tidak mungkin, untuk membaca darinya dan sebaliknya. Melakukannya akan memunculkan error UnSupportedOperation. Kami perlu menutup file sebelum melakukan operasi lain.

Untuk melakukan kedua operasi secara bersamaan, kita harus menambahkan karakter '+' di parameter mode. Karenanya, mode 'w +' atau 'r +' memungkinkan penggunaan metode write () serta read () tanpa menutup file. Objek File juga mendukung fungsi seek () untuk memundurkan aliran ke posisi byte yang diinginkan.

f=open('test.txt','w+')
f.write('Hello world')
f.seek(0,0)
data=f.read()
print (data)
f.close()

Tabel berikut merangkum semua metode yang tersedia untuk file seperti objek.

Sr Tidak Metode & Deskripsi
1

close()

Tutup file. File tertutup tidak dapat dibaca atau ditulis lagi.

2

flush()

Siram buffer internal.

3

fileno()

Mengembalikan deskriptor file integer.

4

next()

Mengembalikan baris berikutnya dari file setiap kali dipanggil. Gunakan iterator next () di Python 3.

5

read([size])

Membaca paling banyak byte ukuran dari file (lebih sedikit jika pembacaan mencapai EOF sebelum mendapatkan byte ukuran).

6

readline([size])

Membaca satu baris penuh dari file. Karakter baris baru yang tertinggal disimpan dalam string.

7

readlines([sizehint])

Membaca sampai EOF menggunakan readline () dan mengembalikan daftar yang berisi baris.

8

seek(offset[, whence])

Menetapkan posisi file saat ini. 0-mulai 1-saat ini 2-akhir.

9

seek(offset[, whence])

Menetapkan posisi file saat ini. 0-mulai 1-saat ini 2-akhir.

10

tell()

Mengembalikan posisi file saat ini

11

truncate([size])

Memotong ukuran file.

12

write(str)

Menulis string ke file. Tidak ada nilai kembali.

Selain objek File yang dikembalikan oleh open()fungsi, operasi file IO juga dapat dilakukan menggunakan pustaka bawaan Python yang memiliki modul os yang menyediakan fungsi bergantung sistem operasi yang berguna. Fungsi ini menjalankan operasi baca / tulis tingkat rendah pada file.

Itu open()Fungsi dari modul os mirip dengan built-in open (). Namun, itu tidak mengembalikan objek file tetapi deskriptor file, bilangan bulat unik yang sesuai dengan file yang dibuka. Nilai deskriptor file 0, 1 dan 2 mewakili aliran stdin, stdout, dan stderr. File lain akan diberi deskriptor file inkremental mulai dari 2 dan seterusnya.

Seperti dalam kasus open() fungsi bawaan, os.open()fungsi juga perlu menentukan mode akses file. Tabel berikut mencantumkan berbagai mode seperti yang didefinisikan dalam modul os.

Sr.No. Modul Os & Deskripsi
1

os.O_RDONLY

Terbuka untuk membaca saja

2

os.O_WRONLY

Terbuka hanya untuk menulis

3

os.O_RDWR

Terbuka untuk membaca dan menulis

4

os.O_NONBLOCK

Jangan memblokir saat terbuka

5

os.O_APPEND

Tambahkan pada setiap tulisan

6

os.O_CREAT

Buat file jika tidak ada

7

os.O_TRUNC

Potong ukuran menjadi 0

8

os.O_EXCL

Kesalahan jika membuat dan file ada

Untuk membuka file baru untuk menulis data di dalamnya, tentukan O_WRONLY sebaik O_CREATmode dengan memasukkan operator pipa (|). Fungsi os.open () mengembalikan deskriptor file.

f=os.open("test.dat", os.O_WRONLY|os.O_CREAT)

Perhatikan bahwa, data ditulis ke file disk dalam bentuk string byte. Oleh karena itu, string normal diubah menjadi string byte dengan menggunakan fungsi encode () seperti sebelumnya.

data="Hello World".encode('utf-8')

Fungsi write () dalam modul os menerima string byte dan deskriptor file ini.

os.write(f,data)

Jangan lupa tutup file menggunakan fungsi close ().

os.close(f)

Untuk membaca konten file menggunakan fungsi os.read (), gunakan pernyataan berikut:

f=os.open("test.dat", os.O_RDONLY)
data=os.read(f,20)
print (data.decode('utf-8'))

Perhatikan bahwa, fungsi os.read () membutuhkan deskriptor file dan jumlah byte yang akan dibaca (panjang string byte).

Jika Anda ingin membuka file untuk operasi baca / tulis secara bersamaan, gunakan mode O_RDWR. Tabel berikut menunjukkan fungsi penting terkait operasi file dalam modul os.

Sr Tidak Fungsi & Deskripsi
1

os.close(fd)

Tutup deskriptor file.

2

os.open(file, flags[, mode])

Buka file dan atur berbagai flag menurut flag dan mungkin modenya menurut mode.

3

os.read(fd, n)

Baca paling banyak n byte dari deskriptor file fd. Kembalikan string yang berisi byte yang telah dibaca. Jika akhir file yang dirujuk oleh fd telah tercapai, string kosong dikembalikan.

4

os.write(fd, str)

Tuliskan string str ke deskriptor file fd. Kembalikan jumlah byte yang sebenarnya ditulis.

Objek file bawaan Python yang dikembalikan oleh fungsi open () bawaan Python memiliki satu kekurangan penting. Ketika dibuka dengan mode 'w', metode write () hanya menerima objek string.

Artinya, jika Anda memiliki data yang direpresentasikan dalam bentuk non-string apa pun, objek baik dalam kelas bawaan (angka, kamus, daftar, atau tupel) atau kelas yang ditentukan pengguna lainnya, itu tidak dapat ditulis ke file secara langsung. Sebelum menulis, Anda perlu mengubahnya menjadi representasi stringnya.

numbers=[10,20,30,40]
   file=open('numbers.txt','w')
   file.write(str(numbers))
   file.close()

Untuk file biner, argumen ke write()metode harus berupa objek byte. Misalnya, daftar bilangan bulat diubah menjadi byte olehbytearray() fungsi dan kemudian ditulis ke file.

numbers=[10,20,30,40]
   data=bytearray(numbers)
   file.write(data)
   file.close()

Untuk membaca kembali data dari file dalam tipe data masing-masing, konversi terbalik perlu dilakukan.

file=open('numbers.txt','rb')
   data=file.read()
   print (list(data))

Jenis konversi manual ini, dari objek ke string atau format byte (dan sebaliknya) sangat rumit dan membosankan. Dimungkinkan untuk menyimpan status objek Python dalam bentuk aliran byte langsung ke file, atau aliran memori dan mengambil ke keadaan aslinya. Proses ini disebut serialisasi dan de-serialisasi.

Pustaka bawaan Python berisi berbagai modul untuk serialisasi dan proses deserialisasi.

Sr.No. Nama & Deskripsi
1

pickle

Pustaka serialisasi khusus Python

2

marshal

Perpustakaan digunakan secara internal untuk serialisasi

3

shelve

Ketekunan benda pythonic

4

dbm

perpustakaan menawarkan antarmuka ke database Unix

5

csv

perpustakaan untuk penyimpanan dan pengambilan data Python ke format CSV

6

json

Library untuk serialisasi ke format JSON universal

Terminologi Python untuk serialisasi dan deserialisasi masing-masing adalah pengawetan dan pembongkaran. Modul acar di pustaka Python, menggunakan format data khusus Python. Oleh karena itu, aplikasi non-Python mungkin tidak dapat melakukan deserialisasi data acar dengan benar. Juga disarankan untuk tidak memisahkan data dari sumber yang tidak diautentikasi.

Data serial (acar) dapat disimpan dalam string byte atau file biner. Modul ini mendefinisikandumps() dan loads()berfungsi untuk mengawetkan dan memisahkan data menggunakan string byte. Untuk proses berbasis file, modul memilikidump() dan load() fungsi.

Protokol acar Python adalah konvensi yang digunakan dalam membangun dan mendekonstruksi objek Python ke / dari data biner. Saat ini, modul acar mendefinisikan 5 protokol berbeda seperti yang tercantum di bawah ini -

Sr.No. Nama & Deskripsi
1

Protocol version 0

Protokol asli "dapat dibaca manusia" kompatibel dengan versi sebelumnya.

2

Protocol version 1

Format biner lama juga kompatibel dengan versi Python sebelumnya.

3

Protocol version 2

Diperkenalkan dengan Python 2.3 memberikan pengawetan kelas gaya baru yang efisien.

4

Protocol version 3

Ditambahkan dengan Python 3.0. disarankan jika kompatibilitas dengan versi Python 3 lainnya diperlukan.

5

Protocol version 4

ditambahkan dengan Python 3.4. Ini menambahkan dukungan untuk objek yang sangat besar

Contoh

Modul acar terdiri dari fungsi dumps () yang mengembalikan representasi string dari data acar.

from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)

Keluaran

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.

Contoh

Gunakan fungsi load (), untuk melepaskan string dan mendapatkan objek kamus asli.

from pickle import load
dct=loads(dctstring)
print (dct)

Keluaran

{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

Objek acar juga bisa disimpan secara terus-menerus dalam file disk, menggunakan fungsi dump () dan diambil menggunakan fungsi load ().

import pickle
f=open("data.txt","wb")
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

#to read
import pickle
f=open("data.txt","rb")
d=pickle.load(f)
print (d)
f.close()

Modul acar juga menyediakan API berorientasi objek untuk mekanisme serialisasi dalam bentuk Pickler dan Unpickler kelas.

Seperti disebutkan di atas, sama seperti objek bawaan di Python, objek kelas yang ditentukan pengguna juga dapat diserialkan secara terus-menerus dalam file disk. Dalam program berikut, kami mendefinisikan kelas Pengguna dengan nama dan nomor ponsel sebagai atribut instannya. Selain konstruktor __init __ (), kelas mengganti metode __str __ () yang mengembalikan representasi string dari objeknya.

class User:
   def __init__(self,name, mob):
      self.name=name
      self.mobile=mob
   def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))

Untuk mengambil objek kelas di atas dalam file kita menggunakan kelas pickler dan metode dump ().

from pickle import Pickler
user1=User('Rajani', '[email protected]', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()

Sebaliknya, kelas Unpickler memiliki metode load () untuk mengambil objek serial sebagai berikut -

from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)

Fitur serialisasi objek modul marshal di pustaka standar Python mirip dengan modul acar. Namun, modul ini tidak digunakan untuk data tujuan umum. Di sisi lain, ini digunakan oleh Python sendiri untuk serialisasi objek internal Python untuk mendukung operasi baca / tulis pada versi terkompilasi dari modul Python (file .pyc).

Format data yang digunakan oleh modul marshal tidak kompatibel di semua versi Python. Oleh karena itu, skrip Python yang dikompilasi (file .pyc) dari satu versi kemungkinan besar tidak akan dijalankan di versi lain.

Sama seperti modul acar, modul marshal juga mendefinisikan fungsi load () dan dump () untuk membaca dan menulis objek yang tersusun dari / ke file.

membuang()

Fungsi ini menulis representasi byte dari objek Python yang didukung ke sebuah file. File itu sendiri menjadi file biner dengan izin menulis

beban()

Fungsi ini membaca data byte dari file biner dan mengubahnya menjadi objek Python.

Contoh berikut menunjukkan penggunaan fungsi dump () dan load () untuk menangani objek kode Python, yang digunakan untuk menyimpan modul Python yang telah dikompilasi sebelumnya.

Kode menggunakan built-in compile() berfungsi untuk membuat objek kode dari string sumber yang menyematkan instruksi Python.

compile(source, file, mode)

Parameter file haruslah file dari mana kode itu dibaca. Jika tidak dibaca dari file, berikan string arbitrer apa pun.

Parameter mode adalah 'exec' jika sumber berisi urutan pernyataan, 'eval' jika ada satu ekspresi atau 'tunggal' jika berisi satu pernyataan interaktif.

Objek kode kompilasi kemudian disimpan dalam file .pyc menggunakan fungsi dump ().

import marshal
script = """
a=10
b=20
print ('addition=',a+b)
"""
code = compile(script, "script", "exec")
f=open("a.pyc","wb")
marshal.dump(code, f)
f.close()

Untuk deserialisasi, objek dari file .pyc menggunakan fungsi load (). Karena, ini mengembalikan objek kode, itu bisa dijalankan menggunakan exec (), fungsi bawaan lainnya.

import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)

Modul rak di pustaka standar Python menyediakan mekanisme persistensi objek yang sederhana namun efektif. Objek rak yang ditentukan dalam modul ini adalah objek seperti kamus yang terus disimpan dalam file disk. Ini membuat file yang mirip dengan database dbm pada sistem seperti UNIX.

Kamus rak memiliki batasan tertentu. Hanya tipe data string yang dapat digunakan sebagai kunci dalam objek kamus khusus ini, sedangkan objek Python apa pun yang dapat dipilih dapat digunakan sebagai nilai.

Modul rak mendefinisikan tiga kelas sebagai berikut -

Sr Tidak Modul & Deskripsi Rak
1

Shelf

Ini adalah kelas dasar untuk implementasi rak. Ini diinisialisasi dengan objek seperti dict.

2

BsdDbShelf

Ini adalah subclass dari kelas Shelf. Objek dict yang diteruskan ke konstruktornya harus mendukung metode first (), next (), prior (), last () dan set_location ().

3

DbfilenameShelf

Ini juga merupakan subclass dari Shelf tetapi menerima nama file sebagai parameter untuk konstruktornya daripada objek dict.

Fungsi open () didefinisikan dalam modul rak yang mengembalikan a DbfilenameShelf obyek.

open(filename, flag='c', protocol=None, writeback=False)

Parameter nama file diberikan ke database yang dibuat. Nilai default untuk parameter flag adalah 'c' untuk akses baca / tulis. Bendera lainnya adalah 'w' (hanya tulis) 'r' (hanya baca) dan 'n' (baru dengan baca / tulis).

Serialisasi itu sendiri diatur oleh protokol acar, standarnya tidak ada. Parameter writeback parameter terakhir secara default adalah false. Jika disetel ke true, entri yang diakses di-cache. Setiap akses memanggil operasi sync () dan close (), oleh karena itu prosesnya mungkin lambat.

Kode berikut membuat database dan menyimpan entri kamus di dalamnya.

import shelve
s=shelve.open("test")
s['name']="Ajay"
s['age']=23
s['marks']=75
s.close()

Ini akan membuat file test.dir di direktori saat ini dan menyimpan data nilai kunci dalam bentuk hash. Objek Shelf memiliki metode berikut yang tersedia -

Sr.No. Metode & Deskripsi
1

close()

menyinkronkan dan menutup objek dikt tetap.

2

sync()

Tulis kembali semua entri dalam cache jika rak dibuka dengan penulisan balik disetel ke True.

3

get()

mengembalikan nilai yang terkait dengan kunci

4

items()

daftar tupel - setiap tupel adalah pasangan nilai kunci

5

keys()

daftar kunci rak

6

pop()

hapus kunci yang ditentukan dan kembalikan nilai yang sesuai.

7

update()

Perbarui rak dari dict lain / dapat diulang

8

values()

daftar nilai rak

Untuk mengakses nilai kunci tertentu di rak -

s=shelve.open('test')
print (s['age']) #this will print 23
   s['age']=25
print (s.get('age')) #this will print 25
s.pop('marks') #this will remove corresponding k-v pair

Seperti dalam objek kamus bawaan, metode items (), keys () dan values ​​() mengembalikan objek tampilan.

print (list(s.items()))
[('name', 'Ajay'), ('age', 25), ('marks', 75)]  

print (list(s.keys()))
['name', 'age', 'marks']

print (list(s.values()))
['Ajay', 25, 75]

Untuk menggabungkan item dari kamus lain dengan rak gunakan metode update ().

d={'salary':10000, 'designation':'manager'}
s.update(d)
print (list(s.items()))

[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]

Paket dbm menyajikan kamus seperti database gaya antarmuka DBM. DBM stands for DataBase Manager. Ini digunakan oleh sistem operasi UNIX (dan sejenisnya UNIX). Library dbbm adalah mesin database sederhana yang ditulis oleh Ken Thompson. Basis data ini menggunakan objek string berenkode biner sebagai kunci, serta nilai.

Database menyimpan data dengan menggunakan satu kunci (kunci utama) dalam bucket berukuran tetap dan menggunakan teknik hashing untuk memungkinkan pengambilan cepat data dengan kunci.

Paket dbm berisi modul-modul berikut -

  • dbm.gnu modul adalah antarmuka ke versi pustaka DBM seperti yang diterapkan oleh proyek GNU.

  • dbm.ndbm modul menyediakan antarmuka untuk implementasi nbdm UNIX.

  • dbm.dumbdigunakan sebagai opsi fallback jika terjadi, implementasi dbm lainnya tidak ditemukan. Ini tidak memerlukan ketergantungan eksternal tetapi lebih lambat dari yang lain.

>>> dbm.whichdb('mydbm.db')
'dbm.dumb'
>>> import dbm
>>> db=dbm.open('mydbm.db','n')
>>> db['name']=Raj Deshmane'
>>> db['address']='Kirtinagar Pune'
>>> db['PIN']='431101'
>>> db.close()

Fungsi open () memungkinkan mode tanda ini -

Sr.No. Nilai & Arti
1

'r'

Buka database yang ada untuk membaca saja (default)

2

'w'

Buka database yang ada untuk membaca dan menulis

3

'c'

Buka database untuk membaca dan menulis, membuatnya jika tidak ada

4

'n'

Selalu buat database baru dan kosong, terbuka untuk membaca dan menulis

Objek dbm adalah objek seperti kamus, seperti objek rak. Karenanya, semua operasi kamus dapat dilakukan. Objek dbm bisa memanggil metode get (), pop (), append () dan update (). Kode berikut membuka 'mydbm.db' dengan bendera 'r' dan melakukan iterasi atas kumpulan pasangan nilai kunci.

>>> db=dbm.open('mydbm.db','r')
>>> for k,v in db.items():
   print (k,v)
b'name' : b'Raj Deshmane'
b'address' : b'Kirtinagar Pune'
b'PIN' : b'431101'

CSV stands for comma separated values. Format file ini adalah format data yang umum digunakan saat mengekspor / mengimpor data ke / dari spreadsheet dan tabel data di database. Modul csv digabungkan dalam pustaka standar Python sebagai hasil dari PEP 305. Modul ini menyajikan kelas dan metode untuk melakukan operasi baca / tulis pada file CSV sesuai rekomendasi PEP 305.

CSV adalah format data ekspor yang disukai oleh perangkat lunak spreadsheet Microsoft Excel. Namun, modul csv dapat menangani data yang direpresentasikan oleh dialek lain juga.

Antarmuka CSV API terdiri dari kelas penulis dan pembaca berikut -

penulis()

Fungsi ini dalam modul csv mengembalikan objek penulis yang mengubah data menjadi string yang dipisahkan dan disimpan dalam objek file. Fungsi tersebut membutuhkan objek file dengan izin tulis sebagai parameter. Setiap baris yang ditulis dalam file mengeluarkan karakter baris baru. Untuk mencegah spasi tambahan antar baris, parameter baris baru disetel ke ''.

Kelas penulis memiliki metode berikut -

writerow ()

Metode ini menulis item dalam iterable (list, tuple atau string), memisahkannya dengan karakter koma.

penulis ()

Metode ini mengambil daftar iterable, sebagai parameter dan menulis setiap item sebagai baris item yang dipisahkan koma dalam file.

Example

Contoh berikut menunjukkan penggunaan fungsi writer (). Pertama, file dibuka dalam mode 'w'. File ini digunakan untuk mendapatkan objek penulis. Setiap tupel dalam daftar tupel kemudian ditulis ke file menggunakan metode writerow ().

import csv
   persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   csvfile=open('persons.csv','w', newline='')
   obj=csv.writer(csvfile)
   for person in persons:
      obj.writerow(person)
csvfile.close()

Output

Ini akan membuat file 'person.csv' di direktori saat ini. Ini akan menunjukkan data berikut.

Lata,22,45
Anil,21,56
John,20,60

Alih-alih mengulang daftar untuk menulis setiap baris secara individual, kita dapat menggunakan metode writerows ().

csvfile=open('persons.csv','w', newline='')
persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   obj=csv.writer(csvfile)
   obj.writerows(persons)
   obj.close()

pembaca()

Fungsi ini mengembalikan objek pembaca yang mengembalikan iterator baris di csv file. Menggunakan perulangan for biasa, semua baris dalam file ditampilkan dalam contoh berikut -

Contoh

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   for row in obj:
      print (row)

Keluaran

['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

Objek pembaca adalah iterator. Oleh karena itu, ini mendukung fungsi next () yang juga dapat digunakan untuk menampilkan semua baris dalam file csv daripada afor loop.

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   while True:
   try:
      row=next(obj)
      print (row)
   except StopIteration:
      break

Seperti yang disebutkan sebelumnya, modul csv menggunakan Excel sebagai dialek defaultnya. Modul csv juga mendefinisikan kelas dialek. Dialek adalah seperangkat standar yang digunakan untuk mengimplementasikan protokol CSV. Daftar dialek yang tersedia dapat diperoleh dengan fungsi list_dialects ().

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

Selain iterable, modul csv dapat mengekspor objek kamus ke file CSV dan membacanya untuk mengisi objek kamus Python. Untuk tujuan ini, modul ini mendefinisikan kelas-kelas berikut -

DictWriter ()

Fungsi ini mengembalikan objek DictWriter. Ini mirip dengan objek penulis, tetapi barisnya dipetakan ke objek kamus. Fungsi tersebut membutuhkan objek file dengan izin tulis dan daftar kunci yang digunakan dalam kamus sebagai parameter nama kolom. Ini digunakan untuk menulis baris pertama dalam file sebagai header.

writeheader ()

Metode ini menulis daftar kunci dalam kamus sebagai baris yang dipisahkan koma sebagai baris pertama dalam file.

Dalam contoh berikut, daftar item kamus ditentukan. Setiap item dalam daftar adalah kamus. Menggunakan metode writrows (), mereka ditulis ke file dengan cara dipisahkan koma.

persons=[
   {'name':'Lata', 'age':22, 'marks':45}, 
   {'name':'Anil', 'age':21, 'marks':56}, 
   {'name':'John', 'age':20, 'marks':60}
]
csvfile=open('persons.csv','w', newline='')
fields=list(persons[0].keys())
obj=csv.DictWriter(csvfile, fieldnames=fields)
obj.writeheader()
obj.writerows(persons)
csvfile.close()

File person.csv menunjukkan konten berikut -

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader ()

Fungsi ini mengembalikan objek DictReader dari file CSV yang mendasarinya. Seperti, dalam kasus, objek pembaca, yang satu ini juga merupakan iterator, yang menggunakan konten file yang diambil.

csvfile=open('persons.csv','r', newline='')
obj=csv.DictReader(csvfile)

Kelas menyediakan atribut fieldnames, mengembalikan kunci kamus yang digunakan sebagai header file.

print (obj.fieldnames)
['name', 'age', 'marks']

Gunakan loop di atas objek DictReader untuk mengambil objek kamus individual.

for row in obj:
   print (row)

Ini menghasilkan keluaran berikut -

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

Untuk mengubah objek OrderedDict ke kamus normal, pertama-tama kita harus mengimpor OrderedDict dari modul koleksi.

from collections import OrderedDict
   r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
   dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}

JSON adalah singkatan dari JavaScript Object Notation. Ini adalah format pertukaran data yang ringan. Ini adalah format teks lintas platform dan tidak bergantung bahasa, didukung oleh banyak bahasa pemrograman. Format ini digunakan untuk pertukaran data antara web server dan klien.

Format JSON mirip dengan acar. Namun, serialisasi acar adalah khusus Python sedangkan format JSON diimplementasikan oleh banyak bahasa sehingga telah menjadi standar universal. Fungsionalitas dan antarmuka modul json di pustaka standar Python mirip dengan modul acar dan marshal.

Sama seperti modul acar, modul json juga menyediakan dumps() dan loads() fungsi untuk serialisasi objek Python menjadi string yang dikodekan JSON, dan dump() dan load() berfungsi menulis dan membaca objek Python berseri ke / dari file.

  • dumps() - Fungsi ini mengubah objek menjadi format JSON.

  • loads() - Fungsi ini mengubah string JSON kembali ke objek Python.

Contoh berikut menunjukkan penggunaan dasar dari fungsi-fungsi ini -

import json
   data=['Rakesh',{'marks':(50,60,70)}]
   s=json.dumps(data)
json.loads(s)

Fungsi dumps () bisa mengambil argumen sort_keys opsional. Secara default, ini adalah False. Jika disetel ke True, kunci kamus muncul dalam urutan yang diurutkan dalam string JSON.

Fungsi dumps () memiliki parameter opsional lain yang disebut indentasi yang mengambil angka sebagai nilai. Ini memutuskan panjang setiap segmen representasi terformat dari string json, mirip dengan keluaran cetak.

Modul json juga memiliki API berorientasi objek yang sesuai dengan fungsi di atas. Ada dua kelas yang ditentukan dalam modul - JSONEncoder dan JSONDecoder.

JSONEncoder kelas

Objek kelas ini adalah encoder untuk struktur data Python. Setiap tipe data Python diubah dalam tipe JSON yang sesuai seperti yang ditunjukkan pada tabel berikut -

Python JSON
Dict obyek
daftar, tuple Himpunan
Str tali
int, float, int- & float-turunan Enum jumlah
Benar benar
Salah Salah
Tidak ada batal

Kelas JSONEncoder dibuat oleh konstruktor JSONEncoder (). Berikut metode penting yang didefinisikan di kelas encoder -

Sr.No. Metode & Deskripsi
1

encode()

membuat serial objek Python ke dalam format JSON

2

iterencode()

Mengkodekan objek dan mengembalikan iterator yang menghasilkan bentuk yang dikodekan dari setiap item dalam objek.

3

indent

Menentukan tingkat indentasi dari string yang dienkode

4

sort_keys

benar atau salah untuk membuat kunci muncul dalam urutan yang diurutkan atau tidak.

5

Check_circular

jika Benar, periksa referensi melingkar di objek tipe kontainer

Contoh berikut mengkodekan objek daftar Python.

e=json.JSONEncoder()
e.encode(data)

Kelas JSONDecoder

Objek kelas ini membantu dalam mendekode dalam string json kembali ke struktur data Python. Metode utama di kelas ini adalah decode (). Kode contoh berikut mengambil objek daftar Python dari string yang disandikan pada langkah sebelumnya.

d=json.JSONDecoder()
d.decode(s)

Modul json mendefinisikan load() dan dump() berfungsi untuk menulis data JSON ke file seperti objek - yang dapat berupa file disk atau aliran byte dan membaca kembali data darinya.

membuang()

Fungsi ini menulis data objek Python JSONed ke sebuah file. File harus dibuka dengan mode 'w'.

import json
data=['Rakesh', {'marks': (50, 60, 70)}]
   fp=open('json.txt','w')
   json.dump(data,fp)
   fp.close()

Kode ini akan membuat 'json.txt' di direktori saat ini. Ini menunjukkan isinya sebagai berikut -

["Rakesh", {"marks": [50, 60, 70]}]

beban()

Fungsi ini memuat data JSON dari file dan mengembalikan objek Python darinya. File harus dibuka dengan izin baca (harus memiliki mode 'r').

Example

fp=open('json.txt','r')
   ret=json.load(fp)
   print (ret)
   fp.close()

Output

['Rakesh', {'marks': [50, 60, 70]}]

Itu json.tool modul juga memiliki antarmuka baris perintah yang memvalidasi data dalam file dan mencetak objek JSON dengan cara yang cukup diformat.

C:\python37>python -m json.tool json.txt
[
   "Rakesh",   
   {
      "marks": [
         50,
         60,
         70
      ]
   }
]

XML adalah singkatan dari eXtensible Markup Language. Ini adalah bahasa portabel, open source, dan lintas platform yang sangat mirip dengan HTML atau SGML dan direkomendasikan oleh World Wide Web Consortium.

Ini adalah format pertukaran data yang terkenal, digunakan oleh banyak aplikasi seperti layanan web, peralatan kantor, dan Service Oriented Architectures(SOA). Format XML dapat dibaca oleh mesin dan manusia.

Paket xml pustaka Python standar terdiri dari modul-modul berikut untuk pemrosesan XML -

Sr.No. Modul & Deskripsi
1

xml.etree.ElementTree

API ElementTree, prosesor XML yang sederhana dan ringan

2

xml.dom

definisi DOM API

3

xml.dom.minidom

implementasi DOM minimal

4

xml.sax

Implementasi antarmuka SAX2

5

xml.parsers.expat

pengikat parser Expat

Data dalam dokumen XML disusun dalam format hierarki seperti pohon, dimulai dengan root dan elemen. Setiap elemen adalah satu node di pohon dan memiliki atribut yang diapit oleh tag <> dan </>. Satu atau lebih sub-elemen dapat ditugaskan ke setiap elemen.

Berikut adalah contoh umum dari dokumen XML -

<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
   <student>
      <name>Ratna</name>
      <subject>Physics</subject>
      <marks>85</marks>
   </student>
   <student>
      <name>Kiran</name>
      <subject>Maths</subject>
      <marks>100</marks>
   </student>
   <student>
      <name>Mohit</name>
      <subject>Biology</subject>
      <marks>92</marks>
   </student>
</studentlist>

Saat menggunakan ElementTreemodul, langkah pertama adalah mengatur elemen root dari pohon. Setiap Elemen memiliki tag dan atribut yang merupakan objek dict. Untuk elemen root, attrib adalah kamus kosong.

import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')

Sekarang, kita dapat menambahkan satu atau lebih elemen di bawah elemen root. Setiap objek elemen mungkin memilikiSubElements. Setiap subelemen memiliki atribut dan properti teks.

student=xmlobj.Element('student')
   nm=xmlobj.SubElement(student, 'name')
   nm.text='name'
   subject=xmlobj.SubElement(student, 'subject')
   nm.text='Ratna'
   subject.text='Physics'
   marks=xmlobj.SubElement(student, 'marks')
   marks.text='85'

Elemen baru ini ditambahkan ke root menggunakan metode append ().

root.append(student)

Tambahkan elemen sebanyak yang diinginkan menggunakan metode di atas. Akhirnya, objek elemen root ditulis ke sebuah file.

tree = xmlobj.ElementTree(root)
   file = open('studentlist.xml','wb')
   tree.write(file)
   file.close()

Sekarang, kita melihat bagaimana mengurai file XML. Untuk itu, buatlah pohon dokumen yang diberi nama sebagai parameter file pada konstruktor ElementTree.

tree = xmlobj.ElementTree(file='studentlist.xml')

Objek pohon memiliki getroot() metode untuk mendapatkan elemen root dan getchildren () mengembalikan daftar elemen di bawahnya.

root = tree.getroot()
children = root.getchildren()

Objek kamus yang sesuai dengan setiap sub elemen dibangun dengan melakukan iterasi atas kumpulan sub-elemen dari setiap simpul anak.

for child in children:
   student={}
   pairs = child.getchildren()
   for pair in pairs:
      product[pair.tag]=pair.text

Setiap kamus kemudian ditambahkan ke daftar yang mengembalikan daftar asli objek kamus.

SAXadalah antarmuka standar untuk penguraian XML berbasis peristiwa. Parsing XML dengan SAX membutuhkan ContentHandler dengan membuat subclass xml.sax.ContentHandler. Anda mendaftarkan callback untuk acara yang diminati dan kemudian, biarkan pengurai melanjutkan melalui dokumen.

SAX berguna ketika dokumen Anda besar atau Anda memiliki keterbatasan memori saat mengurai file saat membacanya dari disk sebagai akibatnya seluruh file tidak pernah disimpan di memori.

Model Objek Dokumen

(DOM) API adalah rekomendasi World Wide Web Consortium. Dalam hal ini, seluruh file dibaca ke dalam memori dan disimpan dalam bentuk hierarki (berbasis pohon) untuk mewakili semua fitur dokumen XML.

SAX, tidak secepat DOM, dengan file besar. Di sisi lain, DOM dapat mematikan sumber daya, jika digunakan pada banyak file kecil. SAX bersifat read-only, sedangkan DOM memungkinkan perubahan pada file XML.

Format plist terutama digunakan oleh MAC OS X. File-file ini pada dasarnya adalah dokumen XML. Mereka menyimpan dan mengambil properti dari suatu objek. Library Python berisi modul plist, yang digunakan untuk membaca dan menulis file 'daftar properti' (biasanya memiliki ekstensi .plist ').

Itu plistlib Module kurang lebih mirip dengan pustaka serialisasi lain dalam arti, modul ini juga menyediakan fungsi dumps () dan load () untuk representasi string dari objek Python dan fungsi load () dan dump () untuk operasi disk.

Objek kamus berikut mempertahankan properti (kunci) dan nilai yang sesuai -

proplist = {
   "name" : "Ganesh",
   "designation":"manager",
   "dept":"accts",
   "salary" : {"basic":12000, "da":4000, "hra":800}
}

Untuk menulis properti ini dalam file disk, kita memanggil fungsi dump () dalam modul plist.

import plistlib
fileName=open('salary.plist','wb')
plistlib.dump(proplist, fileName)
fileName.close()

Sebaliknya, untuk membaca kembali nilai properti, gunakan fungsi load () sebagai berikut -

fp= open('salary.plist', 'rb')
pl = plistlib.load(fp)
print(pl)

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 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 tersebut 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 beralih ke produk database yang berbeda, itu akan 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 terus-menerus 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 execution (), 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 sama, karena database MySQL diinstal pada 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.

Setiap database relasional menyimpan data dalam tabel. Struktur tabel mendefinisikan tipe data atribut yang pada dasarnya hanya tipe data primer yang dipetakan ke tipe data bawaan Python yang sesuai. Namun, objek yang ditentukan pengguna Python tidak dapat disimpan dan diambil secara terus-menerus ke / dari tabel SQL.

Ini adalah perbedaan antara tipe SQL dan bahasa pemrograman berorientasi objek seperti Python. SQL tidak memiliki tipe data yang setara untuk orang lain seperti dict, tuple, list, atau kelas yang ditentukan pengguna.

Jika Anda harus menyimpan objek dalam database relasional, atribut instansinya harus didekonstruksi menjadi tipe data SQL terlebih dahulu, sebelum menjalankan kueri INSERT. Di sisi lain, data yang diambil dari tabel SQL berada dalam tipe utama. Objek Python dengan tipe yang diinginkan harus dibuat dengan menggunakan untuk digunakan dalam skrip Python. Di sinilah Pemetaan Relasional Objek berguna.

Object Relation Mapper (ORM)

Sebuah Object Relation Mapper(ORM) adalah antarmuka antara kelas dan tabel SQL. Kelas Python dipetakan ke tabel tertentu dalam database, sehingga konversi antara objek dan tipe SQL dilakukan secara otomatis.

Kelas Siswa yang ditulis dengan kode Python dipetakan ke tabel Siswa di database. Akibatnya, semua operasi CRUD dilakukan dengan memanggil metode kelas masing-masing. Ini menghilangkan kebutuhan untuk mengeksekusi kueri SQL berkode keras dalam skrip Python.

Perpustakaan ORM dengan demikian bertindak sebagai lapisan abstraksi di atas kueri SQL mentah dan dapat membantu dalam pengembangan aplikasi yang cepat. SQLAlchemyadalah pemeta relasional objek populer untuk Python. Setiap manipulasi status objek model disinkronkan dengan baris terkaitnya di tabel database.

Pustaka SQLALchemy termasuk ORM API dan SQL Expression Language (SQLAlchemy Core). Bahasa ekspresi mengeksekusi konstruksi primitif dari database relasional secara langsung.

ORM adalah pola penggunaan tingkat tinggi dan abstrak yang dibangun di atas SQL Expression Language. Dapat dikatakan bahwa ORM adalah penggunaan terapan dari Expression Language. Kita akan membahas SQLAlchemy ORM API dan menggunakan database SQLite dalam topik ini.

SQLAlchemy berkomunikasi dengan berbagai jenis database melalui implementasi DBAPI masing-masing menggunakan sistem dialek. Semua dialek mengharuskan driver DBAPI yang sesuai diinstal. Dialek untuk jenis database berikut disertakan -

  • Firebird
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL
  • SQLite
  • Sybase

Pemasangan SQLAlchemy mudah dan langsung, menggunakan utilitas pip.

pip install sqlalchemy

Untuk memeriksa apakah SQLalchemy diinstal dengan benar dan versinya, masukkan mengikuti pada prompt Python -

>>> import sqlalchemy
>>>sqlalchemy.__version__
'1.3.11'

Interaksi dengan database dilakukan melalui objek Engine yang diperoleh sebagai nilai pengembalian create_engine() fungsi.

engine =create_engine('sqlite:///mydb.sqlite')

SQLite memungkinkan pembuatan database dalam memori. Mesin SQLAlchemy untuk database dalam memori dibuat sebagai berikut -

from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')

Jika Anda ingin menggunakan database MySQL, gunakan modul DB-API - pymysql dan driver dialeknya.

engine = create_engine('mysql+pymydsql://root@localhost/mydb')

Create_engine memiliki argumen echo opsional. Jika disetel ke true, kueri SQL yang dihasilkan oleh mesin akan digaungkan di terminal.

SQLAlchemy berisi declarative basekelas. Ini bertindak sebagai katalog kelas model dan tabel yang dipetakan.

from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()

Langkah selanjutnya adalah menentukan kelas model. Ini harus diturunkan dari base - object kelas declarative_base seperti di atas.

Setel __tablename__ properti untuk nama tabel yang ingin Anda buat di database. Atribut lain sesuai dengan bidang. Masing-masing adalah objek Kolom di SQLAlchemy dan tipe datanya berasal dari salah satu daftar di bawah ini -

  • BigInteger
  • Boolean
  • Date
  • DateTime
  • Float
  • Integer
  • Numeric
  • SmallInteger
  • String
  • Text
  • Time

Kode berikut adalah kelas model bernama Student yang dipetakan ke tabel Siswa.

#myclasses.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Numeric
base=declarative_base()
class Student(base):
   __tablename__='Students'
   StudentID=Column(Integer, primary_key=True)
   name=Column(String)
   age=Column(Integer)
   marks=Column(Numeric)

Untuk membuat tabel Siswa yang memiliki struktur yang sesuai, jalankan metode create_all () yang ditentukan untuk kelas dasar.

base.metadata.create_all(engine)

Kami sekarang harus mendeklarasikan objek kelas Student kami. Semua transaksi database seperti menambah, menghapus, atau mengambil data dari database, dll., Ditangani oleh objek Sesi.

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()

Data yang disimpan dalam objek Student secara fisik ditambahkan dalam tabel yang mendasari dengan metode add () sesi.

s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()

Di sini, adalah keseluruhan kode untuk menambahkan record pada tabel siswa. Saat dijalankan, log pernyataan SQL yang sesuai akan ditampilkan di konsol.

from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from myclasses import Student, base
engine = create_engine('sqlite:///college.db', echo=True)
base.metadata.create_all(engine)

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()

Keluaran konsol

CREATE TABLE "Students" (
   "StudentID" INTEGER NOT NULL,
   name VARCHAR,
   age INTEGER,
   marks NUMERIC,
   PRIMARY KEY ("StudentID")
)
INFO sqlalchemy.engine.base.Engine ()
INFO sqlalchemy.engine.base.Engine COMMIT
INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
INFO sqlalchemy.engine.base.Engine INSERT INTO "Students" (name, age, marks) VALUES (?, ?, ?)
INFO sqlalchemy.engine.base.Engine ('Juhi', 25, 200.0)
INFO sqlalchemy.engine.base.Engine COMMIT

Itu session object juga menyediakan metode add_all () untuk memasukkan lebih dari satu objek dalam satu transaksi.

sessionobj.add_all([s2,s3,s4,s5])
sessionobj.commit()

Sekarang, record ditambahkan ke dalam tabel, kita ingin mengambil darinya seperti yang dilakukan query SELECT. Objek sesi memiliki metode query () untuk melakukan tugas. Objek kueri dikembalikan oleh metode query () pada model Student kami.

qry=seesionobj.query(Student)

Gunakan metode get () dari objek Query ini mengambil objek yang sesuai dengan kunci utama yang diberikan.

S1=qry.get(1)

Saat pernyataan ini dijalankan, pernyataan SQL terkait yang digaungkan di konsol adalah sebagai berikut -

BEGIN (implicit)
SELECT "Students"."StudentID" AS "Students_StudentID", "Students".name AS 
   "Students_name", "Students".age AS "Students_age", 
   "Students".marks AS "Students_marks"
FROM "Students"
WHERE "Products"."Students" = ?
sqlalchemy.engine.base.Engine (1,)

Metode query.all () mengembalikan daftar semua objek yang bisa dilalui menggunakan loop.

from sqlalchemy import Column, Integer, String, Numeric
from sqlalchemy import create_engine
from myclasses import Student,base
engine = create_engine('sqlite:///college.db', echo=True)
base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
qry=sessionobj.query(Students)
rows=qry.all()
for row in rows:
   print (row)

Memperbarui catatan dalam tabel yang dipetakan sangat mudah. Yang harus Anda lakukan adalah mengambil record menggunakan metode get (), menetapkan nilai baru ke atribut yang diinginkan, lalu melakukan perubahan menggunakan objek sesi. Di bawah ini kami mengubah nilai siswa Juhi menjadi 100.

S1=qry.get(1)
S1.marks=100
sessionobj.commit()

Menghapus rekaman sama mudahnya, dengan menghapus objek yang diinginkan dari sesi.

S1=qry.get(1)
Sessionobj.delete(S1)
sessionobj.commit()

MongoDB berorientasi pada dokumen NoSQLdatabase. Ini adalah database lintas platform yang didistribusikan di bawah lisensi publik sisi server. Ini menggunakan JSON seperti dokumen sebagai skema.

Untuk menyediakan kemampuan untuk menyimpan data yang sangat besar, lebih dari satu server fisik (disebut shard) saling berhubungan, sehingga skalabilitas horizontal tercapai. Database MongoDB terdiri dari dokumen.

Dokumen dianalogikan dengan baris dalam tabel database relasional. Namun, ini tidak memiliki skema tertentu. Dokumen adalah kumpulan pasangan nilai kunci - mirip dengan kamus. Namun, jumlah pasangan kv di setiap dokumen mungkin berbeda. Sama seperti tabel dalam database relasional memiliki kunci utama, dokumen dalam database MongoDB memiliki kunci khusus yang disebut"_id".

Sebelum kita melihat bagaimana database MongoDB digunakan dengan Python, mari kita pahami secara singkat cara menginstal dan memulai MongoDB. Versi komunitas dan komersial MongoDB tersedia. Versi komunitas dapat diunduh dari www.mongodb.com/download-center/community .

Dengan asumsi bahwa MongoDB diinstal di c: \ mongodb, server dapat dipanggil menggunakan perintah berikut.

c:\mongodb\bin>mongod

Server MongoDB aktif di nomor port 22017 secara default. Database disimpan dalam folder data / bin secara default, meskipun lokasinya dapat diubah dengan opsi –dbpath.

MongoDB memiliki serangkaian perintahnya sendiri untuk digunakan di shell MongoDB. Untuk memanggil shell, gunakanMongo perintah.

x:\mongodb\bin>mongo

Shell prompt yang mirip dengan MySQL atau SQLite shell prompt, muncul sebelum perintah NoSQL asli dapat dijalankan. Namun, kami tertarik untuk menghubungkan database MongoDB ke Python.

PyMongomodul telah dikembangkan oleh MongoDB Inc sendiri untuk menyediakan antarmuka pemrograman Python. Gunakan utilitas pip terkenal untuk menginstal PyMongo.

pip3 install pymongo

Dengan asumsi bahwa server MongoDB aktif dan berjalan (dengan mongod perintah) dan mendengarkan di port 22017, pertama-tama kita perlu mendeklarasikan a MongoClientobyek. Ini mengontrol semua transaksi antara sesi Python dan database.

from pymongo import MongoClient
client=MongoClient()

Gunakan objek klien ini untuk membuat koneksi dengan server MongoDB.

client = MongoClient('localhost', 27017)

Database baru dibuat dengan perintah berikut.

db=client.newdb

Database MongoDB dapat memiliki banyak koleksi, mirip dengan tabel dalam database relasional. Objek Koleksi dibuat olehCreate_collection() fungsi.

db.create_collection('students')

Sekarang, kita dapat menambahkan satu atau lebih dokumen dalam koleksi sebagai berikut -

from pymongo import MongoClient
client=MongoClient()
db=client.newdb
db.create_collection("students")
student=db['students']
studentlist=[{'studentID':1,'Name':'Juhi','age':20, 'marks'=100},
{'studentID':2,'Name':'dilip','age':20, 'marks'=110},
{'studentID':3,'Name':'jeevan','age':24, 'marks'=145}]
student.insert_many(studentlist)
client.close()

Untuk mengambil dokumen (mirip dengan query SELECT), kita harus menggunakan find()metode. Ini mengembalikan kursor dengan bantuan yang semua dokumen dapat diperoleh.

students=db['students']
docs=students.find()
for doc in docs:
   print (doc['Name'], doc['age'], doc['marks'] )

Untuk menemukan dokumen tertentu alih-alih semuanya dalam koleksi, kita perlu menerapkan metode filter to find (). Filter menggunakan operator logika. MongoDB memiliki set operator logisnya sendiri seperti di bawah ini -

Sr Tidak Operator MongoDB & operator logika tradisional
1

$eq

sama dengan (==)

2

$gt

lebih besar dari (>)

3

$gte

lebih besar dari atau sama dengan (> =)

4

$in

jika sama dengan nilai apa pun dalam array

5

$lt

kurang dari (<)

6

$lte

kurang dari atau sama dengan (<=)

7

$ne

tidak sama dengan (! =)

8

$nin

jika tidak sama dengan nilai apa pun dalam array

Misalnya, kami tertarik untuk mendapatkan daftar siswa yang berusia lebih dari 21 tahun. Menggunakan operator $ gt di filter untukfind() metode sebagai berikut -

students=db['students']
docs=students.find({'age':{'$gt':21}})
for doc in docs:
   print (doc.get('Name'), doc.get('age'), doc.get('marks'))

Modul PyMongo menyediakan update_one() dan update_many() metode untuk memodifikasi satu dokumen atau lebih dari satu dokumen yang memenuhi ekspresi filter tertentu.

Mari kita perbarui atribut marks dari dokumen yang namanya Juhi.

from pymongo import MongoClient
client=MongoClient()
db=client.newdb
doc=db.students.find_one({'Name': 'Juhi'})
db['students'].update_one({'Name': 'Juhi'},{"$set":{'marks':150}})
client.close()

Cassandra adalah database NoSQL populer lainnya. Skalabilitas tinggi, konsistensi, dan toleransi kesalahan - ini adalah beberapa fitur penting Cassandra. Ini adalahColumn storedatabase. Data disimpan di banyak server komoditas. Hasilnya, data sangat tersedia.

Cassandra adalah produk dari yayasan Apache Software. Data disimpan secara terdistribusi di beberapa node. Setiap node adalah satu server yang terdiri dari ruang kunci. Blok bangunan fundamental dari database Cassandra adalahkeyspace yang dapat dianggap analog dengan database.

Data dalam satu node Cassandra, direplikasi di node lain melalui jaringan node peer-to-peer. Itu membuat Cassandra menjadi database yang sangat mudah. Jaringan itu disebut pusat data. Beberapa pusat data mungkin saling berhubungan untuk membentuk sebuah cluster. Sifat replikasi dikonfigurasi dengan mengatur Strategi replikasi dan faktor replikasi pada saat pembuatan ruang kunci.

Satu ruang kunci mungkin memiliki lebih dari satu keluarga Kolom - seperti satu database yang dapat berisi banyak tabel. Ruang kunci Cassandra tidak memiliki skema yang telah ditentukan sebelumnya. Ada kemungkinan bahwa setiap baris dalam tabel Cassandra mungkin memiliki kolom dengan nama dan nomor variabel yang berbeda.

Software Cassandra juga tersedia dalam dua versi: komunitas dan perusahaan. Versi perusahaan terbaru dari Cassandra tersedia untuk diunduh dihttps://cassandra.apache.org/download/. Edisi komunitas ditemukan dihttps://academy.datastax.com/planet-cassandra/cassandra.

Cassandra memiliki bahasa kuerinya sendiri yang disebut Cassandra Query Language (CQL). Kueri CQL dapat dijalankan dari dalam shell CQLASH - mirip dengan shell MySQL atau SQLite. Sintaks CQL tampak mirip dengan SQL standar.

Edisi komunitas Datastax, juga dilengkapi dengan Develcenter IDE yang ditunjukkan pada gambar berikut -

Modul Python untuk bekerja dengan database Cassandra disebut Cassandra Driver. Ini juga dikembangkan oleh Apache foundation. Modul ini berisi API ORM, serta API inti yang serupa dengan DB-API untuk database relasional.

Pemasangan driver Cassandra mudah dilakukan dengan menggunakan pip utility.

pip3 install cassandra-driver

Interaksi dengan database Cassandra, dilakukan melalui objek Cluster. Modul Cassandra.cluster mendefinisikan kelas Cluster. Pertama-tama kita perlu mendeklarasikan objek Cluster.

from cassandra.cluster import Cluster
clstr=Cluster()

Semua transaksi seperti penyisipan / pembaruan, dll., Dilakukan dengan memulai sesi dengan ruang kunci.

session=clstr.connect()

Untuk membuat ruang kunci baru, gunakan execute()metode objek sesi. Metode execute () mengambil argumen string yang harus berupa string kueri. CQL memiliki pernyataan CREATE KEYSPACE sebagai berikut. Kode lengkapnya adalah sebagai berikut -

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect()
session.execute(“create keyspace mykeyspace with replication={
   'class': 'SimpleStrategy', 'replication_factor' : 3
};”

Sini, SimpleStrategy adalah nilai untuk replication strategy dan replication factordiatur ke 3. Seperti disebutkan sebelumnya, ruang kunci berisi satu atau lebih tabel. Setiap tabel dicirikan oleh tipe datanya. Tipe data Python secara otomatis diurai dengan tipe data CQL yang sesuai menurut tabel berikut -

Jenis Python Jenis CQL
Tidak ada BATAL
Bool Boolean
Mengapung mengapung, ganda
int, panjang int, bigint, varint, smallint, tinyint, counter
desimal. desimal Desimal
str, Unicode ascii, varchar, teks
buffer, bytearray Gumpal
Tanggal Tanggal
Tanggal Waktu Stempel waktu
Waktu Waktu
daftar, tupel, generator Daftar
set, frozenset Set
dict, OrderedDict Peta
uuid.UUID timeuuid, uuid

Untuk membuat tabel, gunakan objek sesi untuk mengeksekusi query CQL untuk membuat tabel.

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
qry= '''
create table students (
   studentID int,
   name text,
   age int,
   marks int,
   primary key(studentID)
);'''
session.execute(qry)

Ruang kunci yang dibuat selanjutnya dapat digunakan untuk menyisipkan baris. Versi CQL dari kueri INSERT mirip dengan pernyataan SQL Insert. Kode berikut menyisipkan baris dalam tabel siswa.

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
session.execute("insert into students (studentID, name, age, marks) values 
   (1, 'Juhi',20, 200);"

Seperti yang Anda harapkan, pernyataan SELECT juga digunakan dengan Cassandra. Dalam kasus metode execution () yang berisi string kueri SELECT, ia mengembalikan objek set hasil yang dapat dilintasi menggunakan loop.

from cassandra.cluster import Cluster
clstr=Cluster()
session=clstr.connect('mykeyspace')
rows=session.execute("select * from students;")
for row in rows:
print (StudentID: {} Name:{} Age:{} price:{} Marks:{}'
   .format(row[0],row[1], row[2], row[3]))

Kueri SELECT Cassandra mendukung penggunaan klausa WHERE untuk menerapkan filter pada set hasil yang akan diambil. Operator logika tradisional seperti <,> == dll. Dikenali. Untuk mengambil, hanya baris tersebut dari tabel siswa untuk nama dengan usia> 20, string kueri dalam metode execute () harus seperti berikut -

rows=session.execute("select * from students WHERE age>20 allow filtering;")

Perhatikan, penggunaan ALLOW FILTERING. Bagian ALLOW FILTERING dari pernyataan ini memungkinkan untuk secara eksplisit mengizinkan (beberapa) kueri yang memerlukan pemfilteran.

Cassandra driver API mendefinisikan kelas tipe Pernyataan berikut dalam modul cassendra.query-nya.

SimpleStatement

Kueri CQL sederhana dan tidak siap yang terdapat dalam string kueri. Semua contoh di atas adalah contoh SimpleStatement.

BatchStatement

Beberapa query (seperti INSERT, UPDATE, dan DELETE) dimasukkan ke dalam batch dan dieksekusi sekaligus. Setiap baris pertama-tama diubah sebagai SimpleStatement dan kemudian ditambahkan secara berkelompok.

Mari kita letakkan baris yang akan ditambahkan pada tabel Students dalam bentuk list tuple sebagai berikut -

studentlist=[(1,'Juhi',20,100), ('2,'dilip',20, 110),(3,'jeevan',24,145)]

Untuk menambahkan baris di atas menggunakan BathStatement, jalankan skrip berikut -

from cassandra.query import SimpleStatement, BatchStatement
batch=BatchStatement()
for student in studentlist:
   batch.add(SimpleStatement("INSERT INTO students 
      (studentID, name, age, marks) VALUES
      (%s, %s, %s %s)"), (student[0], student[1],student[2], student[3]))
session.execute(batch)

PreparedStatement

Pernyataan yang disiapkan seperti kueri berparameter di DB-API. String kuerinya disimpan oleh Cassandra untuk digunakan nanti. Metode Session.prepare () mengembalikan instance PreparedStatement.

Untuk tabel siswa kami, kueri PreparedStatement untuk INSERT adalah sebagai berikut -

stmt=session.prepare("INSERT INTO students (studentID, name, age, marks) VALUES (?,?,?)")

Selanjutnya, hanya perlu mengirim nilai parameter yang akan diikat. Misalnya -

qry=stmt.bind([1,'Ram', 23,175])

Terakhir, jalankan pernyataan terikat di atas.

session.execute(qry)

Ini mengurangi lalu lintas jaringan dan pemakaian CPU karena Cassandra tidak perlu mengurai ulang kueri setiap kali.

ZODB (Zope object Database) adalah database untuk menyimpan objek Python. Ini sesuai dengan ACID - fitur tidak ditemukan di database NOSQL. ZODB juga open source, dapat diskalakan secara horizontal dan bebas skema, seperti banyak database NoSQL. Namun, itu tidak didistribusikan dan tidak menawarkan replikasi yang mudah. Ini menyediakan mekanisme persistensi untuk objek Python. Ini adalah bagian dari server Aplikasi Zope, tetapi juga dapat digunakan secara independen.

ZODB dibuat oleh Jim Fulton dari Zope Corporation. Ini dimulai sebagai Sistem Objek Persisten sederhana. Versi saat ini adalah 5.5.0 dan ditulis sepenuhnya dengan Python. menggunakan versi diperpanjang dari persistensi objek bawaan (acar) Python.

Beberapa fitur utama ZODB adalah -

  • transactions
  • history/undo
  • penyimpanan yang dapat dicolok secara transparan
  • penyimpanan internal
  • kontrol konkurensi multiversion (MVCC)
  • skalabilitas di seluruh jaringan

ZODB adalah a hierarchicaldatabase. Ada objek root, diinisialisasi saat database dibuat. Objek root digunakan seperti kamus Python dan dapat berisi objek lain (yang juga bisa seperti kamus). Untuk menyimpan objek dalam database, cukup dengan menetapkannya ke kunci baru di dalam penampungnya.

ZODB berguna untuk aplikasi yang datanya bersifat hierarkis dan kemungkinan lebih banyak dibaca daripada menulis. ZODB merupakan perpanjangan dari objek acar. Itu sebabnya hanya dapat diproses melalui skrip Python.

Untuk menginstal versi terbaru ZODB, gunakan utilitas pip -

pip install zodb

Dependensi berikut juga diinstal -

  • BTrees==4.6.1
  • cffi==1.13.2
  • persistent==4.5.1
  • pycparser==2.19
  • six==1.13.0
  • transaction==2.4.0

ZODB menyediakan opsi penyimpanan berikut -

FileStorage

Ini adalah defaultnya. Semuanya disimpan dalam satu file Data.fs besar, yang pada dasarnya adalah log transaksi.

DirectoryStorage

Ini menyimpan satu file per revisi objek. Dalam hal ini, Data.fs.index tidak perlu dibangun kembali pada saat shutdown yang tidak bersih.

RelStorage

Ini menyimpan acar dalam database relasional. PostgreSQL, MySQL dan Oracle didukung.

Untuk membuat database ZODB kita membutuhkan penyimpanan, database, dan terakhir koneksi.

Langkah pertama adalah memiliki objek penyimpanan.

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')

Kelas DB menggunakan objek penyimpanan ini untuk mendapatkan objek database.

db = ZODB.DB(storage)

Pass None ke konstruktor DB untuk membuat database dalam memori.

Db=ZODB.DB(None)

Akhirnya, kami membuat koneksi dengan database.

conn=db.open()

Objek koneksi kemudian memberi Anda akses ke 'root' database dengan metode 'root ()'. Objek 'root' adalah kamus yang menampung semua objek persisten Anda.

root = conn.root()

Misalnya, kami menambahkan daftar siswa ke objek root sebagai berikut -

root['students'] = ['Mary', 'Maya', 'Meet']

Perubahan ini tidak disimpan secara permanen dalam database sampai kita melakukan transaksi.

import transaction
transaction.commit()

Untuk menyimpan objek kelas yang ditentukan pengguna, kelas tersebut harus diwarisi dari kelas induk persisten.

Keuntungan dari Subclassing

Kelas Persistent Subclassing memiliki kelebihan sebagai berikut -

  • Basis data secara otomatis akan melacak perubahan objek yang dibuat dengan menyetel atribut.

  • Data akan disimpan dalam record database-nya sendiri.

  • Anda dapat menyimpan data yang tidak mensubkelas Persistent, tetapi akan disimpan dalam rekaman database dari objek persisten apa pun yang mereferensikannya. Objek non-persisten dimiliki oleh objek persisten yang ada di dalamnya dan jika beberapa objek persisten merujuk ke sub objek non-persisten yang sama, objek tersebut akan mendapatkan salinannya sendiri.

Mari gunakan mendefinisikan kelas siswa subclassing kelas Persisten seperti di bawah -

import persistent
   class student(persistent.Persistent):
   def __init__(self, name):
      self.name = name
   def __repr__(self):
      return str(self.name)

Untuk menambahkan objek kelas ini, mari kita atur koneksi seperti yang dijelaskan di atas.

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()

Deklarasikan objek yang ditambahkan ke root dan kemudian lakukan transaksi

s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()

Daftar semua objek yang ditambahkan ke root dapat diambil sebagai objek tampilan dengan bantuan metode items () karena objek root mirip dengan kamus bawaan.

print (root.items())
ItemsView({'s1': Akash})

Untuk mengambil atribut objek tertentu dari root,

print (root['s1'].name)
Akash

Objek dapat dengan mudah diperbarui. Karena ZODB API adalah paket Python murni, tidak memerlukan bahasa tipe SQL eksternal untuk digunakan.

root['s1'].name='Abhishek'
import transaction
transaction.commit()

Basis data akan diperbarui secara instan. Perhatikan bahwa kelas transaksi juga mendefinisikan fungsi abort () yang mirip dengan kontrol transaksi rollback () di SQL.

Microsoft Excel adalah aplikasi spreadsheet paling populer. Telah digunakan sejak lebih dari 25 tahun terakhir. Versi Excel yang lebih baru digunakanOffice Open XML (OOXML) format file. Karenanya, file spreadsheet dapat diakses melalui lingkungan pemrograman lain.

OOXMLadalah format file standar ECMA. Pythonopenpyxl paket menyediakan fungsionalitas untuk membaca / menulis file Excel dengan ekstensi .xlsx.

Paket openpyxl menggunakan nomenklatur kelas yang mirip dengan terminologi Microsoft Excel. Dokumen Excel disebut sebagai buku kerja dan disimpan dengan ekstensi .xlsx dalam sistem file. Sebuah buku kerja mungkin memiliki beberapa lembar kerja. Lembar kerja menyajikan kisi sel yang besar, masing-masing sel dapat menyimpan nilai atau rumus. Baris dan kolom yang membentuk kisi diberi nomor. Kolom diidentifikasi dengan huruf, A, B, C,…., Z, AA, AB, dan seterusnya. Baris diberi nomor mulai dari 1.

Lembar kerja Excel yang khas muncul sebagai berikut -

Utilitas pip cukup baik untuk menginstal paket openpyxl.

pip install openpyxl

Kelas Buku Kerja mewakili buku kerja kosong dengan satu lembar kerja kosong. Kita perlu mengaktifkannya agar beberapa data bisa ditambahkan ke lembar kerja.

from openpyxl import Workbook
wb=Workbook()
sheet1=wb.active
sheet1.title='StudentList'

Seperti yang kita ketahui, sel di lembar kerja dinamai format ColumnNameRownumber. Dengan demikian, sel kiri atas adalah A1. Kami menetapkan string ke sel ini sebagai -

sheet1['A1']= 'Student List'

Bergantian, gunakan lembar kerja cell()metode yang menggunakan nomor baris dan kolom untuk mengidentifikasi sel. Panggil properti nilai ke objek sel untuk menetapkan nilai.

cell1=sheet1.cell(row=1, column=1)
cell1.value='Student List'

Setelah mengisi lembar kerja dengan data, buku kerja disimpan dengan memanggil metode save () dari objek buku kerja.

wb.save('Student.xlsx')

File buku kerja ini dibuat di direktori kerja saat ini.

Mengikuti skrip Python menulis daftar tupel ke dalam dokumen buku kerja. Setiap tupel menyimpan nomor gulungan, usia dan nilai siswa.

from openpyxl import Workbook
wb = Workbook()
sheet1 = wb.active
sheet1.title='Student List'
sheet1.cell(column=1, row=1).value='Student List'
studentlist=[('RollNo','Name', 'age', 'marks'),(1,'Juhi',20,100), 
   (2,'dilip',20, 110) , (3,'jeevan',24,145)]
for col in range(1,5):
   for row in range(1,5):
      sheet1.cell(column=col, row=1+row).value=studentlist[row-1][col-1]
wb.save('students.xlsx')

Buku kerja students.xlsx disimpan di direktori kerja saat ini. Jika dibuka menggunakan aplikasi Excel, akan muncul seperti di bawah ini -

Modul openpyxl menawarkan load_workbook() fungsi yang membantu dalam membaca kembali data dalam dokumen buku kerja.

from openpyxl import load_workbook
wb=load_workbook('students.xlsx')

Anda sekarang dapat mengakses nilai sel apa pun yang ditentukan oleh nomor baris dan kolom.

cell1=sheet1.cell(row=1, column=1)
print (cell1.value)
Student List

Contoh

Kode berikut mengisi daftar dengan data lembar kerja.

from openpyxl import load_workbook
wb=load_workbook('students.xlsx')
sheet1 = wb['Student List']
studentlist=[]
for row in range(1,5):
   stud=[]
for col in range(1,5):
   val=sheet1.cell(column=col, row=1+row).value
stud.append(val)
studentlist.append(tuple(stud))
print (studentlist)

Keluaran

[('RollNo', 'Name', 'age', 'marks'), (1, 'Juhi', 20, 100), (2, 'dilip', 20, 110), (3, 'jeevan', 24, 145)]

Salah satu fitur yang sangat penting dari aplikasi Excel adalah rumusnya. Untuk menetapkan rumus ke sel, tetapkan ke string yang berisi sintaks rumus Excel. Tetapkan fungsi AVERAGE ke sel c6 yang memiliki usia.

sheet1['C6']= 'AVERAGE(C3:C5)'

Modul Openpyxl memiliki Translate_formula()berfungsi untuk menyalin rumus di seluruh rentang. Program berikut mendefinisikan fungsi AVERAGE di C6 dan menyalinnya ke C7 yang menghitung nilai rata-rata.

from openpyxl import load_workbook
wb=load_workbook('students.xlsx')

sheet1 = wb['Student List']
from openpyxl.formula.translate import Translator#copy formula
sheet1['B6']='Average'
sheet1['C6']='=AVERAGE(C3:C5)'
sheet1['D6'] = Translator('=AVERAGE(C3:C5)', origin="C6").translate_formula("D6")
wb.save('students.xlsx')

Lembar kerja yang diubah sekarang muncul sebagai berikut -