Persistensi Data Python - SQLAlchemy

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 Object Relational Mappers 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 dalam 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 berikut 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 basis - objek 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 Session.

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

Data yang disimpan dalam objek Student ditambahkan secara fisik 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 dan kemudian 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()