BİL203U-PROGRAMLAMA II
Ünite 7: Python ile MySQL Veritabanı İşlemleri
Giriş
Veri tabanları, sahip olduğumuz verilerin düzenli bir şekilde tasnif edilerek depolandığı ve ihtiyaç duyulduğunda çeşitli sorgular vasıtasıyla bize geri veren yapılardır. Veri tabanı, uygulamada kullanılacak amaca, bütçeye, çalışacağı ortama kısacası ihtiyaca göre seçilebilir.
Python-MySQL Başlarken
MySQL, piyasada kullanılan en popüler açık kaynak kodlu veri tabanı yönetim sistemlerinden (DBMS) biridir. Çoğu yazılım veriler üzerinde işlem yapması gerektiği için, Python gibi programlama dilleri bu veri kaynaklarına erişmek ve depolamak için araçlar sağlamaktadır.
MySQL ve Python için MySQL Connector Kurulumu
MySQL Connector sürücüsünü yüklemek için komut satırında şu komut çalıştırılmalıdır:
python -m pip install mysql-connector-python
MySQL sürücüsünün doğru bir şekilde kurulduğu da şu kod ile kontrol edilebilir:
import mysql.connector
Veritabanı ile Bağlantı Kurma
MySQL veritabanı ile bir bağlantı kurarak etkileşime girilmektedir. Bu bağlantıyı gerçekleştirebilmek için mysql.connector modülündeki connect() metoduna ihtiyaç duyulmaktadır. Burada veri tabanının mevcut olduğuna dikkat edilmelidir, aksi takdirde hata oluşacaktır. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="veritabanı_adı" )
print( veritabani )
Veritabanı Oluşturma
MySQL veritabanında kod yazarken kullanılacak bir veritabanı oluşturmak için “CREATE DATABASE” komutu çalıştırılması gerekmektedir. “Personel” isimli veritabanı oluşturmak için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi" )
cursor = veritabani.cursor() cursor.execute("CREATE DATABASE personel")
Tablo Oluşturma
Python ile tablo oluşturmak için, sql komutlarını metin şeklinde yazarak, execute() metoduna parametre olarak gönderilerek çalıştırılması yeterli olmaktadır. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" )
Cursor nesnesi oluşturmak için:
cursor = veritabani.cursor()
Tablo oluşturmak için:
calisanTablosu = """CREATE TABLE calisan ( isim VARCHAR(30) NOT NULL, soyisim VARCHAR(30), birim VARCHAR(50), pozisyon INT, dogum_tarihi DATETIME )"""
Oluşturulan tabloyu kontrol etmek için, veritabanındaki tüm tabloları listelemeye yarayan “SHOW TABLES” komutu kullanılabilir.
cursor.execute("SHOW TABLES")
Birincil Anahtar (Primary Key)
Veritabanında tablo oluşturulurken, tabloya eklenen her bir kayıt için benzersiz bir anahtar, değer içeren bir sütun da oluşturulmalıdır. Bu sütuna birincil anahtar adı verilmektedir ve sütunda tutulacak veri de “INT AUTO_INCREMENT PRIMARY KEY” ifadesiyle tanımlanmaktadır. Eğer tablo zaten oluşturulmuş ise, tabloya yeni bir sütun ilave etmek için ALTER TABLE komutu kullanılır.
Veritabanı Komutları
MySQL veritabanı ilişkisel veritabanı yönetim sistemidir (RDBMS). Yapılandırılmış sorgu dili yani sql kullanarak veriler üzerinde işlem yapılmasını sağlar. Veri oluşturma, ekleme, güncelleme ve silme işlemlerini desteklemektedir. Sql komutları büyük-küçük harfe duyarlı değildir.
Insert Komutu
Veritabanındaki tablolara tekli veya çoklu veri kaydı yapılabilir. Veri girişi yapabilmek için insert komutu kullanılmaktadır.
“INSERT INTO” anahtar sözcüğü ile başlayan komut, MySQL sunucusuna yapılacak işlem hakkında bilgi vermektedir. Zorunlu bir ifade olmakla birlikte, kendisinden sonra işlem yapılacak tablo adının gelmesi gerekmektedir. Ardından veri girilmesi istenilen tablodaki sütun adları istenilen sırayla tanımlanır. “VALUES”
anahtar sözcüğünden sonra da, verilen sütun isim ve veri türlerine göre sıra uyumu gözetilerek, verilerin girilmesi beklenmektedir. Kod içerisinde kullanılan cursor(), satırlar üzerinde sırayla işlem yapmaktadır. Veritabanına girilmesi istenen verilerin kaydedilmesi için de veritabani.commit() metodu kullanılmaktadır.
Çoklu kayıt girişinde de benzer şekilde veriler oluşturulmakta ve “execute” metodu, “executemany” ile değiştirilmektedir.
Select Komutu
SELECT komutu ile, tablolara girilen verileri okuma işlemi gerçekleştirilmektedir. Diğer veritabanı komutlarının işlenmesi gibi, cursor.execute() kullanılarak komut çalıştırılmakta ve cursor.fetchall() ile tablodan alınan veriler bir liste şeklinde döndürülmektedir:
SELECT sütun_adı1, sütun_adı2, sütun_adı3, ... FROM tablo_adı
Tüm sütunların seçilmesi için joker karakteri olarak “*” karakteri kullanılmaktadır:
SELECT * FROM tablo_adı
Daha önce oluşturulmuş olan tablodan sadece isimler ve kayıt numaraları için düzenleyecek kod ise şu şekildedir:
sql = "SELECT id, isim, soyisim FROM calisan"
Ayrıca cursor.fetchone() metodu ile sorgu sonucunda gelen ilk satırın verisi alınabilir.
Where Komutu
Veritabanı sorgusunda “WHERE” komutu kullanılarak sorgu yapılmaktadır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" )
Cursor nesnesi oluşturma:
cursor = veritabani.cursor()
sql = "SELECT id, isim, soyisim FROM calisan WHERE birim = 'Bilgi İşlem'" cursor.execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )
Ayrıca, filtreleme yaparken, aranmak istenen ifade kayıtların başında, içinde veya sonunda olabilir. Böyle durumlar için de joker karakteri olarak “%” sembolü kullanılmaktadır.
• “%” karakteri aranan ifadenin sadece başına konulduğunda, ifadeden önce ne gelirse gelsin ama bu ifade ile bitsin anlamına gelmektedir. • “%” karakteri aranan ifadenin sadece sonuna konulduğunda, ifadeden sonra ne gelirse gelsin ama bu ifade ile başlasın anlamına gelmektedir. • “%” karakteri aranan ifadenin hem başına hem de sonuna konulduğunda, ifadeden önce ve sonra ne gelirse gelsin ama bu ifadeyi içersin anlamına gelmektedir.
Bu gibi bir sorgu yapıldığında artık “=” karşılaştırması yerine, bu filtreye benzer olanları getir diyerek “LIKE” komutu kullanılmaktadır.
Order By Komutu
Tablo verilerinde istenilen filtreleme sonucunu, istenilen sütuna göre artan veya azalan düzende sıralama yapmak için ORDER BY ifadesi kullanılmaktadır. ORDER BY ifadesi, varsayılan değer olarak ASC (ASCENDING) artan şekilde sıralamaktadır. Sonucun azalan şekilde sıralanması için de DESC (DESCENDING) anahtar sözcüğü kullanılmaktadır.
Bu işlem için aşağıdaki komut çalıştırılır:
cursor = veritabani.cursor()
sql = "SELECT id, isim, soyisim, birim FROM calisan ORDER BY soyisim " cursor.execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )
Büyükten küçüğe doğru sıralama için ise aşağıdaki komut çalıştırılır:
cursor = veritabani.cursor()
sql = "SELECT id, isim, soyisim, birim FROM calisan ORDER BY id DESC" cursor.execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )
Delete Komutu
Tablodan herhangi bir verinin silinmesi için DELETE komutu kullanılmaktadır. Silinen veriyi geri getirmek mümkün olmamaktadır. veritabani.commit() metodu çağrılmadan tablo üzerinde yapılan işlemler veritabanında güncellenmeyecektir. Ayrıca WHERE şartının eklenmediği bir DELETE komutu, tablodaki tüm verileri silecektir. Silme işlemi için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı",
password="kurulum_şifresi", database="personel" )
cursor = veritabani.cursor()
sql = "DELETE FROM calisan WHERE id = 7" cursor.execute( sql )
veritabani.commit()
print( cursor.rowcount, "kayıt silindi" )
Drop Table Komutu
Veritabanında varolan bir tabloyu silmek için DROP TABLE komutu kullanılmaktadır. Tablo ile ilgili tüm veriler, indeksler gibi bilgiler de silinecektir. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" ) cursor = veritabani.cursor()
sql = "DROP TABLE calisan" cursor.execute( sql )
Örnek kod başarı ile çalıştırıldığı zaman herhangi bir hata uyarısı görüntülenmeyecektir. Olmayan bir tablo silinmeye çalışıldığında da hata alınacaktır. Böyle bir durumun önüne geçebilmek için IF EXIST anahtar kelimesi kullanılmaktadır.
Update Komutu
UPDATE yani güncelleme komutu, veri tabanında kayıtlı verilerin değerlerini değiştirmek için kullanılmaktadır. Bu komut ile hatalı veriler düzeltilebilir veya son işlem tarihi gibi değişen veriler güncellenebilir. Bu komut sadece veriler üzerinde etkilidir, tablonun yapısı ile ilgili bir değişiklik yapmaz. Böylece tabloda sürekli güncel ve doğru verilerin tutulmasına yardımcı olur. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" )
cursor = veritabani.cursor()
sql = "UPDATE calisan SET dogum_tarihi = '2000-04-17' WHERE id = 3" cursor.execute( sql )
veritabani.commit()
print( cursor.rowcount, "kayıt güncellendi" )
veritabani.commit() metodu çağırılmadan tablo üzerinde yapılan işlemler veritabanında güncellenmeyecektir. Ayrıca WHERE şartının eklenmediği bir UPDATE komutu ile tablodaki tüm veriler güncellenecektir.
Limit Komutu
LIMIT komutu, çalıştırılan sorgudan dönen sonuç kümesindeki verilerin sayısını kontrol etmek veya sınırlandırmak için kullanılmaktadır. Varsayılan olarak ilk kayıttan itibaren verilen limit değeri kadar veri getirmektedir. Ayrıca OFFSET anahtar kelimesi ile, özel aralıkların da alınabilmesi sağlanmaktadır. Bu işlem için aşağıdaki komut çalıştırılır:
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" )
cursor = veritabani.cursor() sql = "SELECT id, isim, soyisim, birim FROM calisan LIMIT 3" cursor .execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )
Join Komutu
JOIN komutu ile iki veya daha fazla tablonun verileri, aralarındaki ilişkili sütunlara göre birleştirilir. 3 çeşit tablo birleştirmesi bulunmaktadır.
Inner Join
Join ve Inner Join komutları aynı şekilde çalışmaktadır. Tabloların kesişim elemanlarını döndürür. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" ) cursor = veritabani.cursor() sql = "SELECT calisan.isim, calisan.soyisim, \ urunler.tur, urunler.isim \ FROM calisan\ INNER JOIN urunler ON calisan.favori = urunler.id "
cursor .execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )
Left Join
Tablo2 ile ortak olmayan verileri hariç tutarak, Tablo1’deki verileri döndürmektedir. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" )
cursor = veritabani.cursor() sql = "SELECT calisan.isim, calisan.soyisim, \ urunler.tur, urunler.isim \ FROM calisan\ LEFT JOIN urunler ON calisan.favori = urunler.id "
cursor .execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )
Right Join
Tablo1 ile ortak olmayan verileri hariç tutarak, Tablo2’deki verileri döndürmektedir. Bu işlem için aşağıdaki komut çalıştırılır:
import mysql.connector
veritabani = mysql.connector.connect( host="localhost", user="kullanıcı_adı", password="kurulum_şifresi", database="personel" )
cursor = veritabani.cursor() sql = "SELECT calisan.isim, calisan.soyisim, \ urunler.tur, urunler.isim \ FROM calisan\ RIGHT JOIN urunler ON calisan.favori = urunler.id “
cursor .execute( sql )
sonucListe = cursor.fetchall()
for eleman in sonucListe: print( eleman )