Python Veri Sürekliliği - SQLAlchemy
Herhangi bir ilişkisel veritabanı, verileri tablolarda tutar. Tablo yapısı, temelde yalnızca Python'un ilgili yerleşik veri türlerine eşlenen birincil veri türlerinden olan özniteliklerin veri türünü tanımlar. Ancak, Python'un kullanıcı tanımlı nesneleri kalıcı olarak depolanamaz ve SQL tablolarına / tablolarından alınamaz.
Bu, SQL türleri ile Python gibi nesne yönelimli programlama dilleri arasında bir uyumsuzluktur. SQL, dikte, tuple, liste veya herhangi bir kullanıcı tanımlı sınıf gibi diğerleri için eşdeğer veri türüne sahip değildir.
Bir nesneyi ilişkisel bir veritabanında saklamanız gerekiyorsa, INSERT sorgusunu çalıştırmadan önce nesnenin örnek nitelikleri SQL veri türlerine dönüştürülmelidir. Öte yandan, bir SQL tablosundan alınan veriler birincil türdedir. Python betiğinde kullanılmak üzere istenen türde bir Python nesnesi inşa edilmelidir. Burası Nesne İlişkisel Haritacılarının yararlı olduğu yerdir.
Nesne İlişki Eşleştiricisi (ORM)
Bir Object Relation Mapper(ORM), bir sınıf ve bir SQL tablosu arasındaki bir arayüzdür. Bir Python sınıfı, veri tabanındaki belirli bir tabloyla eşlenir, böylece nesne ve SQL türleri arasındaki dönüşüm otomatik olarak gerçekleştirilir.
Python koduyla yazılan Öğrenci sınıfı, veritabanındaki Öğrenciler tablosuyla eşleştirilir. Sonuç olarak, tüm CRUD işlemleri, sınıfın ilgili yöntemlerini çağırarak yapılır. Bu, Python betiğinde sabit kodlanmış SQL sorguları yürütme ihtiyacını ortadan kaldırır.
ORM kitaplığı bu nedenle ham SQL sorguları üzerinde bir soyutlama katmanı görevi görür ve hızlı uygulama geliştirmede yardımcı olabilir. SQLAlchemyPython için popüler bir nesne ilişkisel eşleştiricidir. Model nesnesinin durumunun herhangi bir şekilde değiştirilmesi, veritabanı tablosundaki ilgili satırı ile senkronize edilir.
SQLALchemy kitaplığı şunları içerir: ORM API ve SQL İfade Dili (SQLAlchemy Core). İfade dili, ilişkisel veritabanının ilkel yapılarını doğrudan yürütür.
ORM, SQL İfade Dili üzerine inşa edilmiş yüksek seviyeli ve soyutlanmış bir kullanım modelidir. ORM'nin İfade Dilinin uygulamalı bir kullanımı olduğu söylenebilir. SQLAlchemy ORM API'yi tartışacağız ve bu konuda SQLite veritabanını kullanacağız.
SQLAlchemy, bir lehçe sistemi kullanarak ilgili DBAPI uygulamaları aracılığıyla çeşitli veritabanı türleriyle iletişim kurar. Tüm lehçeler, uygun bir DBAPI sürücüsünün kurulu olmasını gerektirir. Aşağıdaki veritabanı türleri için lehçeler dahildir -
- Firebird
- Microsoft SQL Sunucusu
- MySQL
- Oracle
- PostgreSQL
- SQLite
- Sybase
SQLAlchemy'nin kurulumu pip yardımcı programını kullanarak kolay ve basittir.
pip install sqlalchemy
SQLalchemy'nin düzgün şekilde kurulup kurulmadığını ve sürümünün olup olmadığını kontrol etmek için Python komut isteminde aşağıdakileri girin -
>>> import sqlalchemy
>>>sqlalchemy.__version__
'1.3.11'
Veritabanı ile etkileşimler, bir dönüş değeri olarak elde edilen Engine nesnesi aracılığıyla yapılır. create_engine() işlevi.
engine =create_engine('sqlite:///mydb.sqlite')
SQLite, bellek içi veritabanı oluşturulmasına izin verir. Bellek içi veritabanı için SQLAlchemy motoru aşağıdaki gibi oluşturulur -
from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')
Bunun yerine MySQL veritabanını kullanmayı düşünüyorsanız, DB-API modülünü - pymysql ve ilgili lehçe sürücüsünü kullanın.
engine = create_engine('mysql+pymydsql://root@localhost/mydb')
Create_engine'ın isteğe bağlı bir yankı bağımsız değişkeni vardır. True olarak ayarlanırsa, motor tarafından üretilen SQL sorguları terminalde yankılanacaktır.
SQLAlchemy şunları içerir: declarative basesınıf. Model sınıfları ve eşlenmiş tablolardan oluşan bir katalog görevi görür.
from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()
Sonraki adım, bir model sınıfı tanımlamaktır. Yukarıdaki gibi declarative_base sınıfının base - nesnesinden türetilmelidir.
Ayarlamak __tablenameVeritabanında oluşturulmasını istediğiniz tablonun adı için __ özelliği. Diğer özellikler alanlara karşılık gelir. Her biri SQLAlchemy'de bir Column nesnesidir ve veri türü aşağıdaki listeden biridir -
- BigInteger
- Boolean
- Date
- DateTime
- Float
- Integer
- Numeric
- SmallInteger
- String
- Text
- Time
Aşağıdaki kod, Student tablosuna eşlenen Student adlı model sınıfıdır.
#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)
Karşılık gelen bir yapıya sahip bir Öğrenciler tablosu oluşturmak için, temel sınıf için tanımlanan create_all () yöntemini çalıştırın.
base.metadata.create_all(engine)
Şimdi Öğrenci sınıfımızın bir nesnesini beyan etmeliyiz. Veritabanından veri ekleme, silme veya geri alma gibi tüm veritabanı işlemleri, bir Oturum nesnesi tarafından gerçekleştirilir.
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sessionobj = Session()
Student nesnesinde depolanan veriler, oturumun add () yöntemi ile temel tabloya fiziksel olarak eklenir.
s1 = Student(name='Juhi', age=25, marks=200)
sessionobj.add(s1)
sessionobj.commit()
Öğrenciler tablosuna kayıt eklemek için kodun tamamı burada. Yürütüldüğünde, ilgili SQL deyimi günlüğü konsolda görüntülenir.
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()
Konsol çıkışı
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
session object ayrıca, tek bir işlemde birden fazla nesne eklemek için add_all () yöntemini sağlar.
sessionobj.add_all([s2,s3,s4,s5])
sessionobj.commit()
Artık tabloya kayıtlar eklendiğine göre, aynen SELECT sorgusunun yaptığı gibi ondan getirmek istiyoruz. Oturum nesnesi, görevi gerçekleştirmek için query () yöntemine sahiptir. Sorgu nesnesi, Student modelimizde query () yöntemi ile döndürülür.
qry=seesionobj.query(Student)
Bu Sorgu nesnesinin get () yöntemini kullanın, verilen birincil anahtara karşılık gelen nesneyi getirir.
S1=qry.get(1)
Bu ifade yürütülürken, konsolda yankılanan karşılık gelen SQL ifadesi aşağıdaki gibi olacaktır -
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,)
Query.all () yöntemi, bir döngü kullanılarak geçilebilen tüm nesnelerin bir listesini döndürür.
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)
Eşlenen tablodaki bir kaydı güncellemek çok kolaydır. Tek yapmanız gereken get () yöntemini kullanarak bir kayıt almak, istenen özniteliğe yeni bir değer atamak ve ardından değişiklikleri oturum nesnesini kullanarak uygulamaktır. Aşağıda Juhi öğrencinin notunu 100 olarak değiştiriyoruz.
S1=qry.get(1)
S1.marks=100
sessionobj.commit()
Oturumdan istenen nesneyi silerek bir kaydı silmek de aynı derecede kolaydır.
S1=qry.get(1)
Sessionobj.delete(S1)
sessionobj.commit()