Python - MySQL Veritabanı Erişimi
Veritabanı arayüzleri için Python standardı, Python DB-API'dir. Çoğu Python veritabanı arayüzü bu standarda uymaktadır.
Uygulamanız için doğru veritabanını seçebilirsiniz. Python Veritabanı API, aşağıdakiler gibi çok çeşitli veritabanı sunucularını destekler:
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
Kullanılabilir Python veritabanı arayüzlerinin listesi: Python Veritabanı Arayüzleri ve API'ler . Erişmeniz gereken her veritabanı için ayrı bir DB API modülü indirmelisiniz. Örneğin, bir Oracle veritabanına ve ayrıca bir MySQL veritabanına erişmeniz gerekiyorsa, hem Oracle hem de MySQL veritabanı modüllerini indirmeniz gerekir.
DB API, mümkün olan her yerde Python yapılarını ve sözdizimini kullanarak veritabanları ile çalışmak için minimum bir standart sağlar. Bu API aşağıdakileri içerir -
- API modülünü içe aktarma.
- Veritabanıyla bir bağlantı elde ediliyor.
- SQL deyimleri ve saklı yordamlar yayınlama.
- Bağlantının kapatılması
MySQL kullanarak tüm kavramları öğrenecektik, o yüzden MySQLdb modülünden bahsedelim.
MySQLdb nedir?
MySQLdb, Python'dan bir MySQL veritabanı sunucusuna bağlanmak için bir arayüzdür. Python Veritabanı API v2.0'ı uygular ve MySQL C API'sinin üzerine inşa edilmiştir.
MySQLdb'yi Nasıl Kurarım?
Devam etmeden önce, makinenizde MySQLdb'nin kurulu olduğundan emin olun. Python betiğinize aşağıdakileri yazın ve çalıştırın -
#!/usr/bin/python
import MySQLdb
Aşağıdaki sonucu verirse, MySQLdb modülünün kurulu olmadığı anlamına gelir -
Traceback (most recent call last):
File "test.py", line 3, in <module>
import MySQLdb
ImportError: No module named MySQLdb
MySQLdb modülünü kurmak için aşağıdaki komutu kullanın -
For Ubuntu, use the following command -
$ sudo apt-get install python-pip python-dev libmysqlclient-dev
For Fedora, use the following command -
$ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
For Python command prompt, use the following command -
pip install MySQL-python
Note - Yukarıdaki modülü yüklemek için kök ayrıcalığına sahip olduğunuzdan emin olun.
Veritabanı Bağlantısı
Bir MySQL veritabanına bağlanmadan önce aşağıdakilerden emin olun -
Bir TESTDB veritabanı oluşturdunuz.
TESTDB'de EMPLOYEE tablosu oluşturdunuz.
Bu tabloda FIRST_NAME, LAST_NAME, AGE, SEX ve INCOME alanları var.
"Testuser" kullanıcı kimliği ve "test123" şifresi TESTDB'ye erişmek için ayarlanmıştır.
Python modülü MySQLdb, makinenize düzgün bir şekilde yüklenmiş.
MySQL Temellerini anlamak için MySQL eğitiminden geçtiniz.
Misal
Aşağıda MySQL veritabanı "TESTDB" ile bağlantı kurma örneği verilmiştir
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")
# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print "Database version : %s " % data
# disconnect from server
db.close()
Bu betiği çalıştırırken, Linux makinemde aşağıdaki sonucu veriyor.
Database version : 5.0.45
Veri kaynağıyla bir bağlantı kurulursa, bir Bağlantı Nesnesi döndürülür ve db aksi takdirde daha fazla kullanım için dbYok olarak ayarlanmıştır. Sonraki,db nesne oluşturmak için kullanılır cursornesne, sırayla SQL sorgularını yürütmek için kullanılır. Son olarak, çıkmadan önce veritabanı bağlantısının kapatılmasını ve kaynakların serbest bırakılmasını sağlar.
Veritabanı Tablosu Oluşturma
Bir veritabanı bağlantısı kurulduktan sonra, kullanarak veritabanı tablolarına tablo veya kayıt oluşturmaya hazırız. execute oluşturulan imlecin yöntemi.
Misal
EMPLOYEE veritabanı tablosu oluşturalım -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# disconnect from server
db.close()
INSERT İşlemi
Kayıtlarınızı bir veritabanı tablosunda oluşturmak istediğinizde gereklidir.
Misal
Aşağıdaki örnek, EMPLOYEE tablosunda bir kayıt oluşturmak için SQL INSERT ifadesini çalıştırır -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Dinamik olarak SQL sorguları oluşturmak için yukarıdaki örnek aşağıdaki gibi yazılabilir -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Misal
Aşağıdaki kod segmenti, parametreleri doğrudan iletebileceğiniz başka bir yürütme biçimidir -
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................
OKUMA İşlemi
Herhangi bir veritabanı üzerinde READ İşlemi, veritabanından bazı yararlı bilgileri almak anlamına gelir.
Veritabanı bağlantımız kurulduktan sonra, bu veritabanına bir sorgulama yapmaya hazırsınız. İkisini de kullanabilirsinizfetchone() tek kaydı getirme yöntemi veya fetchall() bir veritabanı tablosundan birden çok değeri getirme yöntemi.
fetchone()- Bir sorgu sonuç kümesinin sonraki satırını getirir. Sonuç kümesi, bir tabloyu sorgulamak için bir imleç nesnesi kullanıldığında döndürülen bir nesnedir.
fetchall()- Bir sonuç kümesindeki tüm satırları getirir. Sonuç kümesinden bazı satırlar zaten çıkarılmışsa, sonuç kümesinden kalan satırları alır.
rowcount - Bu salt okunur bir özelliktir ve bir execute () yönteminden etkilenen satırların sayısını döndürür.
Misal
Aşağıdaki prosedür, 1000'den fazla maaşı olan ÇALIŞAN tablosundaki tüm kayıtları sorgular -
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
(fname, lname, age, sex, income )
except:
print "Error: unable to fecth data"
# disconnect from server
db.close()
Bu, aşağıdaki sonucu verecektir -
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
Güncelleme İşlemi
GÜNCELLEME Herhangi bir veritabanı üzerinde işlem, veritabanında zaten mevcut olan bir veya daha fazla kaydı güncellemek anlamına gelir.
Aşağıdaki prosedür, SEX olan tüm kayıtları günceller. 'M'. Burada tüm erkeklerin YAŞ'ını bir yıl artırıyoruz.
Misal
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
DELETE İşlemi
Veritabanınızdan bazı kayıtları silmek istediğinizde DELETE işlemi gereklidir. Aşağıda, AGE'nin 20'den fazla olduğu ÇALIŞAN'dan tüm kayıtları silme prosedürü verilmiştir -
Misal
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
İşlem Yapmak
İşlemler, veri tutarlılığını sağlayan bir mekanizmadır. İşlemler aşağıdaki dört özelliğe sahiptir -
Atomicity - Ya bir işlem tamamlanır ya da hiçbir şey olmaz.
Consistency - Bir işlem tutarlı bir durumda başlamalı ve sistemi tutarlı bir durumda bırakmalıdır.
Isolation - Bir işlemin ara sonuçları, mevcut işlemin dışında görünmez.
Durability - Bir işlem yapıldığında, sistem arızasından sonra bile etkiler kalıcıdır.
Python DB API 2.0 ya da iki yöntem sağlar işlemek veya geri alma işlem.
Misal
İşlemleri nasıl uygulayacağınızı zaten biliyorsunuz. İşte yine benzer bir örnek -
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
COMMIT İşlemi
Commit, değişiklikleri sonlandırmak için veri tabanına yeşil sinyal veren ve bu işlemden sonra hiçbir değişiklik geri alınamayan işlemdir.
İşte aramak için basit bir örnek commit yöntem.
db.commit()
GERİ DÖNME İşlemi
Bir veya daha fazla değişiklikten memnun değilseniz ve bu değişiklikleri tamamen geri almak istiyorsanız, o zaman kullanın rollback() yöntem.
İşte aramak için basit bir örnek rollback() yöntem.
db.rollback()
Veritabanının Bağlantısını Kesme
Veritabanı bağlantısını kesmek için close () yöntemini kullanın.
db.close()
Bir veritabanına olan bağlantı kullanıcı tarafından close () yöntemiyle kapatılırsa, bekleyen tüm işlemler DB tarafından geri alınır. Ancak, alt düzey DB uygulama ayrıntılarından herhangi birine bağlı olmak yerine, uygulamanız açıkça commit veya geri alma çağırmaktan daha iyi olacaktır.
Hataları Yönetme
Birçok hata kaynağı var. Birkaç örnek, yürütülen bir SQL deyimindeki sözdizimi hatası, bir bağlantı hatası veya önceden iptal edilmiş veya bitmiş bir ifade tutamacı için getirme yönteminin çağrılmasıdır.
DB API, her bir veritabanı modülünde bulunması gereken bir dizi hatayı tanımlar. Aşağıdaki tablo bu istisnaları listelemektedir.
Sr.No. | İstisna ve Açıklama |
---|---|
1 | Warning Önemli olmayan sorunlar için kullanılır. StandardError alt sınıfı olmalıdır. |
2 | Error Hatalar için temel sınıf. StandardError alt sınıfı olmalıdır. |
3 | InterfaceError Veritabanının kendisindeki değil, veritabanı modülündeki hatalar için kullanılır. Alt sınıf hatası olmalı. |
4 | DatabaseError Veritabanındaki hatalar için kullanılır. Alt sınıf hatası olmalı. |
5 | DataError Verilerdeki hatalara başvuran DatabaseError alt sınıfı. |
6 | OperationalError Veritabanı bağlantısının kesilmesi gibi hatalara başvuran DatabaseError alt sınıfı. Bu hatalar genellikle Python betikleyicisinin kontrolü dışındadır. |
7 | IntegrityError Benzersizlik kısıtlamaları veya yabancı anahtarlar gibi ilişkisel bütünlüğe zarar verebilecek durumlar için DatabaseError alt sınıfı. |
8 | InternalError Bir imlecin artık etkin olmaması gibi, veritabanı modülündeki dahili hatalara başvuran DatabaseError alt sınıfı. |
9 | ProgrammingError Kötü bir tablo adı gibi hatalara ve güvenle sizin suçlanabileceğiniz diğer şeylere başvuran DatabaseError alt sınıfı. |
10 | NotSupportedError Desteklenmeyen işlevselliği çağırmayı ifade eden DatabaseError alt sınıfı. |
Python komut dosyalarınız bu hataları işlemelidir, ancak yukarıdaki istisnalardan herhangi birini kullanmadan önce, MySQLdb'nizin bu istisnayı desteklediğinden emin olun. DB API 2.0 spesifikasyonunu okuyarak onlar hakkında daha fazla bilgi edinebilirsiniz.