Python 3 - 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
  • SQLite

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 ifadeleri ve saklı yordamlar yayınlama.
  • Bağlantının kapatılması

Python, SQLite için yerleşik bir desteğe sahiptir. Bu bölümde, MySQL kullanarak tüm kavramları öğreneceğiz. MySQL ile popüler bir arayüz olan MySQLdb modülü Python 3 ile uyumlu değildir. Bunun yerine PyMySQL modülünü kullanacağız .

PyMySQL nedir?

PyMySQL, Python'dan bir MySQL veritabanı sunucusuna bağlanmak için bir arayüzdür. Python Veritabanı API v2.0'ı uygular ve saf bir Python MySQL istemci kitaplığı içerir. PyMySQL'in amacı, MySQLdb'nin yerini almaktır.

PyMySQL'i Nasıl Kurarım?

Devam etmeden önce, makinenizde PyMySQL'in kurulu olduğundan emin olun. Python betiğinize aşağıdakileri yazın ve çalıştırın -

#!/usr/bin/python3

import pymysql

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 pymysql
ImportError: No module named pymysql

Son kararlı sürüm PyPI'de mevcuttur ve pip ile kurulabilir -

pip install pymysql

Alternatif olarak (örneğin, pip yoksa), GitHub'dan bir tarball indirilebilir ve aşağıdaki gibi Setuptools ile kurulabilir -

$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6). $ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL* $ python setup.py install
$ # The folder PyMySQL* can be safely removed now.

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ğıdaki noktalardan 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ü PyMySQL, 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/python3

import pymysql

# Open database connection
db = pymysql.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 aşağıdaki sonucu verir.

Database version : 5.5.20-log

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 dışarı çı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 tablolar veya kayıtlar oluşturmaya hazırız. execute oluşturulan imlecin yöntemi.

Misal

Bir Veritabanı tablosu oluşturalım EMPLOYEE -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.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

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 yürütür -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.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/python3

import pymysql

# Open database connection
db = pymysql.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 OKUMA İşlemi, veritabanından bazı yararlı bilgileri almak anlamına gelir.

Veritabanı bağlantısı kurulduktan sonra, bu veritabanına bir sorgulama yapmaya hazırsınız. İkisini de kullanabilirsinizfetchone() tek bir 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/python3

import pymysql

# Open database connection
db = pymysql.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 = "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 fetch data")

# disconnect from server
db.close()

Çıktı

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/python3

import pymysql

# Open database connection
db = pymysql.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/python3

import pymysql

# Open database connection
db = pymysql.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()

İşlemlerin Gerçekleştirilmesi

İş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ı cari işlemin dışında görünmez.

  • Durability - Bir işlem yapıldığında, sistem hatası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 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şikliklerin sonlandırılması için veritabanına yeşil sinyal veren ve bu işlemden sonra hiçbir değişiklik geri alınamayan bir işlemdir.

İşte aranacak basit bir örnek commit yöntem.

db.commit()

GERİ DÖNME İşlemi

Değişikliklerden bir veya daha fazlasından memnun değilseniz ve bu değişiklikleri tamamen geri almak istiyorsanız, o zaman rollback() yöntem.

İşte aranacak 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 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ına bağlantı kaybı 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 atıfta bulunan DatabaseError alt sınıfı.

10

NotSupportedError

Desteklenmeyen işlevselliği çağırmaya çalışmayı 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.