Python Data Persistence - Sqlite3 Modülü
CSV, JSON, XML, vb. Dosyalarının önemli bir dezavantajı, doğaları gereği büyük ölçüde yapılandırılmamış olmaları nedeniyle rastgele erişim ve işlem işleme için çok yararlı olmamalarıdır. Bu nedenle, içeriği değiştirmek çok zorlaşır.
Bu düz dosyalar, zaman uyumsuz işleme yeteneğinden yoksun oldukları için istemci-sunucu ortamı için uygun değildir. Yapılandırılmamış veri dosyalarının kullanılması, veri fazlalığına ve tutarsızlığa yol açar.
İlişkisel bir veritabanı kullanılarak bu sorunların üstesinden gelinebilir. Veritabanı, fazlalık ve tutarsızlığı ortadan kaldırmak ve veri bütünlüğünü korumak için organize edilmiş bir veri koleksiyonudur. İlişkisel veritabanı modeli oldukça popülerdir.
Temel kavramı, verileri varlık tablosunda düzenlemektir (ilişki denir). Varlık tablosu yapısı, değeri her satır için benzersiz olan bir öznitelik sağlar. Böyle bir öznitelik denir'primary key'.
Bir tablonun birincil anahtarı diğer tabloların yapısında göründüğünde, buna 'Foreign key've bu ikisi arasındaki ilişkinin temelini oluşturur. Bu modele göre, şu anda mevcut birçok popüler RDBMS ürünü bulunmaktadır -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
SQLite, çok çeşitli uygulamalarda kullanılan hafif bir ilişkisel veritabanıdır. Bağımsız, sunucusuz, sıfır konfigürasyonlu, işlemsel bir SQL veritabanı motorudur. Tüm veritabanı, dosya sisteminin herhangi bir yerine yerleştirilebilen tek bir dosyadır. Çok az yer kaplayan ve sıfır konfigürasyona sahip açık kaynaklı bir yazılımdır. Yaygın olarak gömülü cihazlarda, IoT'de ve mobil uygulamalarda kullanılır.
Tüm ilişkisel veritabanları, tablolardaki verileri işlemek için SQL kullanır. Bununla birlikte, daha önce, bu veritabanlarının her biri, veritabanı türüne özgü Python modülü yardımıyla Python uygulamasıyla bağlantılıydı.
Dolayısıyla aralarında bir uyumsuzluk vardı. Bir kullanıcı farklı bir veritabanı ürününe geçmek isterse, bu zor olacaktır. Bu uyumsuzluk sorunu, DB-API olarak bilinen ilişkisel veritabanlarına tutarlı arayüz önermek için 'Python Geliştirme Önerisi (PEP 248)' yükseltilerek giderildi. Son öneriler denirDB-APISürüm 2.0. (PEP 249)
Python'un standart kitaplığı, SQLite veritabanını Python programı aracılığıyla işlemek için DB-API uyumlu bir modül olan sqlite3 modülünden oluşur. Bu bölüm Python'un SQLite veritabanı ile bağlantısını açıklamaktadır.
Daha önce de belirtildiği gibi, Python, sqlite3 modülü biçiminde SQLite veritabanı için dahili desteğe sahiptir. Diğer veritabanları için, ilgili DB-API uyumlu Python modülünün pip yardımcı programı yardımıyla kurulması gerekecektir. Örneğin MySQL veritabanını kullanmak için PyMySQL modülünü kurmamız gerekiyor.
pip install pymysql
DB-API'de aşağıdaki adımlar önerilir -
Kullanarak veritabanıyla bağlantı kurun connect() işlevi ve bağlantı nesnesini elde et.
Aramak cursor() imleç nesnesini almak için bağlantı nesnesinin yöntemi.
Yürütülecek bir SQL ifadesinden oluşan bir sorgu dizisi oluşturun.
İstenilen sorguyu çağırarak yürütün execute() yöntem.
Bağlantıyı kapatın.
import sqlite3
db=sqlite3.connect('test.db')
Burada db, test.db'yi temsil eden bağlantı nesnesidir. Zaten mevcut değilse bu veritabanının oluşturulacağını unutmayın. Db bağlantı nesnesi aşağıdaki yöntemlere sahiptir:
Sr.No. | Yöntemler ve Açıklama |
---|---|
1 | cursor(): Bu Bağlantıyı kullanan bir İmleç nesnesi döndürür. |
2 | commit(): Herhangi bir bekleyen işlemi veritabanına açıkça taahhüt eder. |
3 | rollback(): Bu isteğe bağlı yöntem, bir işlemin başlangıç noktasına geri alınmasına neden olur. |
4 | close(): Veritabanına olan bağlantıyı kalıcı olarak kapatır. |
Bir imleç, sonucun bir veya daha fazla satırının alınmasına izin veren belirli bir SQL sorgusu için bir tutamaç görevi görür. İmleç nesnesi, aşağıdaki ifadeyi kullanarak SQL sorgularını yürütmek için bağlantıdan elde edilir -
cur=db.cursor()
İmleç nesnesinin tanımlanmış aşağıdaki yöntemleri vardır -
Sr.No | Yöntemler ve Açıklama |
---|---|
1 | execute() SQL sorgusunu bir dize parametresinde yürütür. |
2 | executemany() Tuple listesindeki bir dizi parametre kullanarak SQL sorgusunu yürütür. |
3 | fetchone() Sorgu sonuç kümesinden sonraki satırı alır. |
4 | fetchall() Sorgu sonuç kümesinden kalan tüm satırları alır. |
5 | callproc() Depolanan bir yordamı çağırır. |
6 | close() İmleç nesnesini kapatır. |
Aşağıdaki kod test.db'de bir tablo oluşturur: -
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()
Bir veri tabanında istenilen veri bütünlüğü, commit() ve rollback()bağlantı nesnesinin yöntemleri. SQL sorgu dizesi, uygun şekilde işlenmesi gereken bir istisna oluşturabilecek yanlış bir SQL sorgusuna sahip olabilir. Bunun için execute () ifadesi try bloğu içine yerleştirilir Başarılı olursa sonuç commit () yöntemi kullanılarak kalıcı olarak kaydedilir. Sorgu başarısız olursa, işlem rollback () yöntemi kullanılarak geri alınır.
Aşağıdaki kod, test.db'deki öğrenci tablosunda INSERT sorgusunu yürütür.
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()
INSERT sorgusunun değerler cümlesindeki verilerin dinamik olarak kullanıcı girdisi tarafından sağlanmasını istiyorsanız, Python DB-API'de önerilen parametre değiştirmeyi kullanın. ? karakter, sorgu dizesinde bir yer tutucu olarak kullanılır ve değerleri execute () yönteminde bir demet biçiminde sağlar. Aşağıdaki örnek, parametre değiştirme yöntemini kullanarak bir kayıt ekler. Giriş olarak isim, yaş ve notlar alınır.
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()
Sqlite3 modülü, executemany()aynı anda birden fazla kayıt ekleyebilen yöntem. Eklenecek veriler, her bir demet bir kayıt içerecek şekilde bir tuple listesinde verilmelidir. Liste nesnesi, sorgu dizesiyle birlikte execemany () yönteminin parametresidir. Ancak, execemany () yöntemi diğer modüller tarafından desteklenmemektedir.
UPDATEsorgu genellikle WHERE yan tümcesi ile belirtilen mantıksal bir ifade içerir execute () yöntemindeki sorgu dizesi bir UPDATE sorgu sözdizimi içermelidir. Name = 'Anil' için 'age' değerini 23 olarak güncellemek için dizeyi aşağıdaki gibi tanımlayın:
qry="update student set age=23 where name='Anil';"
Güncelleme sürecini daha dinamik hale getirmek için, yukarıda açıklanan parametre ikame yöntemini kullanıyoruz.
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()
Benzer şekilde, DELETE işlemi, SQL'in DELETE sorgu sözdizimine sahip bir dizeyle execute () yöntemini çağırarak gerçekleştirilir. Bu arada,DELETE sorgu ayrıca genellikle bir WHERE fıkra.
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()
Bir veritabanı tablosundaki önemli işlemlerden biri, ondan kayıtların alınmasıdır. SQL sağlarSELECTamaç için sorgulama. SELECT sorgu sözdizimini içeren bir dize execute () yöntemine verildiğinde, bir sonuç kümesi nesnesi döndürülür. Sonuç kümesinden bir veya daha fazla kaydın alınabileceği bir imleç nesnesine sahip iki önemli yöntem vardır.
fetchone ()
Sonuç kümesinden bir sonraki mevcut kaydı alır. Getirilen kaydın her sütununun değerlerinden oluşan bir demettir.
fetchall ()
Kalan tüm kayıtları bir tuple listesi biçiminde alır. Her demet bir kayda karşılık gelir ve tablodaki her sütunun değerlerini içerir.
Aşağıdaki örnek öğrenci tablosundaki tüm kayıtları listeler
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()
SQLite veritabanı yerine bir MySQL veritabanı kullanmayı planlıyorsanız, PyMySQLmodülü yukarıda açıklandığı gibi. Veritabanı bağlantı sürecindeki tüm adımlar aynıdır, çünkü MySQL veritabanı bir sunucuya kurulur, connect () işlevi URL'ye ve oturum açma kimlik bilgilerine ihtiyaç duyar.
import pymysql
con=pymysql.connect('localhost', 'root', '***')
SQLite ile farklılık gösterebilecek tek şey MySQL'e özgü veri türleridir. Benzer şekilde, herhangi bir ODBC uyumlu veritabanı pyodbc modülü yüklenerek Python ile kullanılabilir.