Kurs
MySQL, istemci-sunucu modelini benimseyen bir ilişkisel veritabanı yönetim sistemidir (RDBMS). Bunun anlamı şudur: Veriye erişmek isteyen bir bilgisayar ("istemci"), bunu yapmak için RDBMS sunucusuna bağlanmak zorundadır.
Öte yandan Python, yaygın olarak kullanılan, üst düzey ve genel amaçlı bir programlama dilidir. Geliştiriciler sıklıkla web siteleri ve yazılımlar oluşturmak, görevleri otomatikleştirmek ve verileri analiz etmek için kullanır. MySQL dahil çeşitli veritabanlarıyla da kullanılabilir. Python; veri sorgulama ifadelerini, veri tanımlama dilini ve veri işleme işlemlerini destekler. Bu eğitimde Python’da MySQL ile nasıl çalışacağınızı göreceksiniz.
Python’da MySQL’e Başlarken
Python’da MySQL’i DataCamp çalışma alanınızdan kullanmak için mevcut barındırılan bir veritabanına bağlanmak üzere çalışma alanı entegrasyonlarını kullanmalısınız. Biz veritabanımızı sıfırdan oluşturacağız, bu nedenle bu eğitimde DataCamp çalışma alanını kullanmayacağız.
Bu eğitimi adım adım takip etmek için iki adımı tamamlamalısınız:
- MySQL sunucusunu kurun; bu, veritabanını yönetmek için gerekli hizmetleri sağlar. MySQL web sitesinden indirip kurabilirsiniz.
- MySQL connector’ı kurun; bu, Python uygulamalarınızı MySQL veritabanlarınıza entegre etmenize yardımcı olan bir Python sürücüsüdür. pip (Python’un paket yöneticisi) ile kolayca kurulabilir.
MySQL sunucusunu kurduktan sonra:
- Bu GitHub deposunu yerel makinenize klonlayın – GitHub’da depo nasıl klonlanır?
- Sanal bir ortam oluşturup etkinleştirin – sanal ortamların oluşturulması.
- Gerekli paketleri terminalden
pip install -r requirementskomutuyla kurun. - Kök dizinde bir
.envdosyası oluşturun. - MySQL sunucusunda kullanıcınızı doğrulamak için parolanızı
PASSWORDadlı bir değişkende saklayın – kök kullanıcıya parola atamadıysanız sunucu parola gerektirmez.
Uyarılar
Depodaki her dosya, bu eğitimdeki sırasını göstermek için bir numarayla başlar.
Örneğin, 04_data_insertion.py modülün 4. (01 - 03’ten sonra) çalıştırılması gerektiğini belirtir. Tüm kodu 00_execute_all.py dosyasını çalıştırarak da yürütebilirsiniz.
Bağlantı kurma
MySQL bir sunucu-istemci modelini izler; bir istemci veriye erişmek istediğinde RDBMS’ye bağlanmak zorundadır.
Sunucuyla bağlantı kurmanın yolu, mysql.connector modülündeki connect() yöntemini kullanmaktır…
import os
from mysql import connector
from dotenv import load_dotenv
load_dotenv()
PASSWORD = os.getenv("PASSWORD")
try:
with connector.connect(
host = "localhost",
user = "root",
password = PASSWORD
) as database:
print(database)
except connector.Error as e:
print(e)
"""
<mysql.connector.connection_cext.CMySQLConnection object at 0x00000188FA653970>
"""
connect() yönteminin tüm argüman kapsamını dokümantasyonda görebilirsiniz.
Bu kodla ilgili dikkat edilmesi gereken üç nokta vardır:
- İstisna ve Hata yönetimi: MySQL sunucusuna bağlantı kurarken hataları ele almak iyi bir uygulamadır.
- Bağlantıyı kapatma: Bir bağlam yöneticisi kullandık, bu nedenle bağlantıyı
close()yöntemiyle açıkça kapatmadık. Genel olarak, beklenmedik hataları önlemek için veritabanına erişiminiz bittiğinde bağlantılar kapatılmalıdır. - Hassas veriler: Hassas bilgileri gizlemek için ortam değişkenlerini kullanın; paylaşmak güvenlik riski oluşturur.
Artık Python programınız ile MySQL sunucusu arasında bir bağlantı kurduğunuza göre, sunucuda bulunabilecek çok sayıdaki veritabanından birine bağlanmaya hazırsınız. Şu anda hiç yok; bu da sunucu içinde yeni bir veritabanı oluşturmamız gerektiği anlamına geliyor. Bunu bir sonraki bölümde nasıl yapacağımıza bakalım.
Not: Veritabanına her erişildiğinde sunucuyla bir bağlantı kurulmalıdır. Eğitim boyunca tekrarı önlemek için sonraki kod örneklerinde bunu koddan çıkaracağız. Ancak kod tabanına dahildir.
Python ile MySQL’de yeni bir veritabanı oluşturma
Bundan sonra SQL becerilerine ihtiyacınız olacak; DataCamp’in Introduction to SQL kursu hızlıca seviyenizi yükseltmek için iyi bir başlangıç noktasıdır.
MySQL’de veritabanı oluşturmanın tipik yolu şöyledir:
CREATE DATABASE book_ratings;
Aynı sorguyu Python’da gerçekleştirmek için cursor() nesnesinin bir örneğini oluşturmalısınız.
cursor() nesnesinden, SQL komutlarını dize olarak execute() yöntemine iletip kodu yürütebilirsiniz.
“book_ratings” adlı bir veritabanı oluşturalım…
create_db = "CREATE DATABASE book_ratings"
with database.cursor() as cursor:
cursor.execute(create_db)
Not: Bu kodu birden fazla kez çalıştırmak, veritabanının zaten var olduğunu bildiren bir hata yükseltecektir.
Bir sunucuda mevcut veritabanlarını şu şekilde kontrol edebilirsiniz:
show_existing_db = "SHOW DATABASES"
with database.cursor() as cursor:
cursor.execute(show_existing_db)
for db in cursor:
print(db)
"""
('book_ratings',)
('information_schema',)
('mysql',)
('performance_schema',)
('sakila',)
('sys',)
('world',)
"""
Yukarıdaki kod, şu anda MySQL sunucumuzda bulunan tüm veritabanlarının adlarını çıktılar. Birden fazla olmasının nedeni, MySQL sunucusunun çeşitli veritabanı üst verilerine ve sunucu ayarlarına erişim sağlamak için otomatik olarak veritabanları oluşturmasıdır.
Mevcut bir veritabanına bağlanma
Diyelim ki bir veritabanı oluşturdunuz ancak henüz sunucuya bağlanmadınız; veritabanına doğrudan nasıl bağlanırsınız?
Kolay.
Veritabanının adını connect() yöntemine argüman olarak iletin:
try:
with connector.connect(
host = "localhost",
user = "root",
password = PASSWORD,
database = "book_ratings"
) as database:
print(database})
except connector.Error as e:
print(e)
"""
<mysql.connector.connection_cext.CMySQLConnection object at 0x0000016DD8C24970>
"""
Tablo Oluşturma
Bir veritabanındaki bilgiler bir tabloda saklanır. Tablo, sütunlar ve satırlardan oluşan ilgili veri koleksiyonlarını saklamak için kullanılan bir formattan ibarettir.
Bir veritabanında, birbirleriyle ilişkili olmasalar bile birden çok tablo bulunabilir. Bu bölümde göstereceğimiz gibi, tek bir tablo içeren ilişkisel bir veritabanınız da olabilir – ilişkisel veritabanları hakkındaki bilginizi Introduction to Relational Databases in SQL kursuyla genişletin.
Tablo oluşturma, şimdiye kadar gördüğünüze benzer bir yaklaşımı izler;
- Bir SQL komutunu dize olarak yazın
- Bunu imleç nesnesinin
execute()yöntemine iletin.
Bu örnekteki SQL ifadesi CREATE TABLE’dır.
Bunu kullanarak kitaplar için bir tablo oluşturalım:
create_books_table = """
CREATE TABLE books(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100),
genre VARCHAR(100),
release_year YEAR(4)
)
"""
# Create cursor object
with existing_database.cursor() as cursor:
cursor.execute(create_books_table)
existing_database.commit()
Kodun son satırında, existing_database nesnemiz üzerinde commit() yöntemini kullandığımızı fark etmiş olabilirsiniz. Bunu yapmak zorundaydık çünkü MySQL Python connector’ın varsayılan davranışı bir işlemi otomatik olarak onaylamamaktır.
Bir tabloda veriyi her değiştirdiğinizde commit() yöntemini çağırmalısınız – MySQL dokümanlarında commit() hakkında daha fazla bilgi edinin.
Kodda dikkat edilmesi gereken diğer önemli noktalar şunlardır:
NOT NULL: Bir sütununNULLdeğerleri kabul etmemesini zorlayan bir kısıtlama.PRIMARY KEY: Bir tablodaki belirli satırları tanımlamak için kullanılan benzersiz değer.AUTO_INCREMENT: Tabloya eklenen yeni kayıtlar için otomatik olarak benzersiz bir sayı üretir.
Şemamızın doğru oluşturulup oluşturulmadığını DESCRIBE ifadesini kullanarak ve ardından imleç nesnemiz üzerinde fetchall() yöntemiyle tüm öğeleri yazdırarak kontrol edebiliriz…
describe_books = "DESCRIBE books"
with existing_database.cursor() as cursor:
cursor.execute(describe_books)
books_schema = cursor.fetchall()
for column in books_schema:
print(column)
"""
('id', b'int', 'NO', 'PRI', None, 'auto_increment')
('title', b'varchar(100)', 'YES', '', None, '')
('author', b'varchar(100)', 'YES', '', None, '')
('genre', b'varchar(100)', 'YES', '', None, '')
('release_year', b'year', 'YES', '', None, '')
"""
Veri ekleme
Önceki bölümlerde, book_ratings veritabanımızda books adlı bir tablo oluşturduk. Şu anda bu tablo boş. Bir sonraki bölümde bir tabloyu doldurmak için elinizdeki iki yaklaşımdan bahsedeceğiz.
Tek bir kayıt ekleme
Bazen bir tabloya tek bir kayıt eklemeniz gerekebilir. Gerçek dünyada bu nadir olsa da, yine de aşağıdaki gibi yapabilirsiniz:
# INSERT SINGLE RECORD
insert_single_record = "INSERT INTO books (id, title, author, genre, release_year)\
VALUES (%s, %s, %s, %s, %s)"
single_record = (
"1", "Choose Yourself! Be Happy, Make Millions, Live the Dream", "James Altucher", "self-help", "2013"
)
# Create cursor object
with existing_database.cursor() as cursor:
cursor.execute(insert_single_record, single_record)
existing_database.commit()
Birden çok kayıt ekleme
Bir tabloya veri eklemenin daha yaygın yolu, imleç nesnesinin executemany(operation_to_perform, seq_of_params) yöntemini kullanmaktır; bu, aynı anda birden fazla kayıt eklemenizi sağlar.
Yapmak istediğimiz işlemin yapısı aynı kalır; yalnızca parametreler dizisini güncelleriz.
Koddaki görünümü şöyledir:
multiple_records = [
(
"2",
"Skip the Line: The 10,000 Experiments Rule and Other Surprising Advice for Reaching Your Goals",
"James Altucher",
"self-help",
"2021"
),
(
"3",
"The Power of No: Because One Little Word Can Bring Health, Abundance, and Happiness",
"James Altucher",
"self-help",
"2014"
),
]
with existing_database.cursor() as cursor:
cursor.executemany(insert_multiple_records, multiple_records)
existing_database.commit()
Veri seçme
SELECT ifadesi, bir veritabanındaki bir veya daha fazla tablodan seçilen satırları almak için kullanılır. SELECT ifadesini iki şekilde kullanabiliriz:
- Bir tablodan belirli sütunları seçmek.
select_specific_cols = "SELECT author, release_year FROM books"
with existing_database.cursor() as cursor:
cursor.execute(select_specific_cols)
- Tüm sütunları yıldız "*" kullanarak döndürmek
# Create cursor object
select_all_cols = "SELECT * FROM books"
with existing_database.cursor() as cursor:
cursor.execute(select_all_cols)
Verileri Sıralama ve Filtreleme
Verileri sıralamak ve filtrelemek, kayıtların karşılaması gereken belirli ölçütler sağlayarak ilgilendiğiniz sonuçları döndürmenizi sağlar.
İşte birkaç örnek:
WHERE
WHERE ifadesi, belirtilen bir koşula göre verileri filtrelemenizi sağlar.
Örneğin, 2010 ve öncesinde yayımlanmış herhangi bir kitap için yazarın adını ve kitap başlığını çıkarmak istediğimizi varsayalım:
condition = "SELECT author, title FROM books WHERE release_year <= 2010"
with existing_database.cursor() as cursor:
cursor.execute(condition)
ORDER BY
ORDER BY ifadesini sonuçları artan (ASC) veya azalan (DESC) düzende sıralamak için de kullanabiliriz. Varsayılan kipin, aksi açıkça belirtilmedikçe her zaman artan sıra olduğunu unutmayın.
Verilerimizi yayımlanma yılına göre azalan düzende şöyle sıralarız:
order_by_year = "SELECT * FROM books ORDER BY release_year DESC"
with existing_database.cursor() as cursor:
cursor.execute(order_by_year)
LIMIT
LIMIT ifadesi, sonuç kümesinde döndürülecek kayıt sayısını belirtmenize olanak tanır.
# Create cursor object
define_limit = "SELECT * FROM books LIMIT 3"
with existing_database.cursor() as cursor:
cursor.execute(define_limit)
Yukarıdaki kod, döndürülecek kayıt sayısını üçle sınırlar.
Verileri Güncelleme ve Silme
Bazen veriler değişir, artık kullanışlı değildir veya yanlıştır. Bu bölümde, bu durumları güncellemeler ve silmeler ile nasıl yöneteceğinizi öğreneceksiniz.
UPDATE
UPDATE sorgusu, bir tablonun yapısını etkilemeden mevcut değerleri değiştirmenize olanak tanır.
Örneğin, biri adını değiştirirse bir kaydı güncellemeniz gerekebilir; kodda şöyle görünür:
update_query = """
UPDATE
books
SET
author = "Big J"
WHERE
author = "James Altucher"
"""
with existing_database.cursor() as cursor:
cursor.execute(update_query)
existing_database.commit()
DELETE
DELETE sorgusu, bir tablodan bir kaydı silmenizi sağlar:
drop_record = "DELETE FROM books WHERE release_year <= 2000"
with existing_database.cursor() as cursor:
cursor.execute(drop_record)
existing_database.commit()
Bu kodda, yayımlanma yılı 2000 veya daha eski olan tüm kayıtları sildik.
DROP TABLE
DROP TABLE ifadesi, bir tabloyu veritabanından kalıcı olarak kaldırmanızı sağlar. IF EXISTS eklemek, düşürmek istediğiniz tablonun var olup olmadığından emin olmadığınız senaryolara uyum sağlar ancak tamamen isteğe bağlıdır.
book_ratings veritabanımızda oluşturduğumuz tabloyu kaldıralım:
drop_table = "DROP TABLE IF EXISTS books"
with existing_database.cursor() as cursor:
cursor.execute(drop_table)
existing_database.commit()
Sonuç
Bu eğitimde, Python’da bir MySQL sunucusuyla nasıl bağlantı kurulacağını, yeni bir veritabanı oluşturmayı, mevcut bir veritabanına bağlanmayı, bir tablo oluşturmayı ve Python’dan bir MySQL tablosu üzerinde çeşitli sorgu işlemlerini yürütmeyi öğrendiniz.
Öğrenmeye devam etmek için aşağıdaki kaynaklara göz atın:
