# # Python MySQL Veritabanı

MySQL, programlamada en yaygın kullanılan ve en popüler ilişkisel veritabanı yazılımıdır. Sektörün önde gelen firmalarının neredeyse tamamına yakını MySQL ile beraber çalışır vaziyetteler. Hem bu sebeple hem de sunduğu güçlü çözümlerle bizde bu dersimizde MYSQL ve Python ilişkisini anlatacağız.

![MySQL kullanan siteler](/files/-Lw4x5Ql89-WhOVPtqzh)

## 1. MySQL Avantajları

* Açık kaynak kodludur ve ücretsizdir. (Ücretli versiyonu da mevcuttur)
* Farklı karakter setlerini (iso8859-9, utf-8, latin-5 …) destekler
* Çok esnek ve güçlü bir kullanıcı erişim kısıtlama/yetkilendirme sistemine sahiptir
* Güvenlik açısından kendini kanıtlamıştır
* Döküman ve eğitim konusunda geniş kaynağa sahiptir
* Birçok programlama dili ve platformla birlikte kullanılabilir.

## 2. Veritabanı İşlemleri

MySQL veritabanı yazılımını Python ile birlikte nasıl kullanacağımızı aşama aşama görelim.

### 2.1 Kütüphanenin Kurulması ve Projeye Dahil Etme

MySQL ile veritabanı işlemlerimizi rahatça yapabilmemiz için **PyMySql** kütüphanemizi projemize dahil etmemiz gerekiyor.&#x20;

```
import pymysql.cursors
```

Eğer kütüphane bilgisayarınızda kurulu değilse **pip** kullanarak bilgisayarınıza yükleyebilirsiniz.

```
pip install PyMySQL
```

### 2.2 MySQL Veritabanı Bağlantısı <a href="#id-2-mysql-veritaban-ba-lant-s" id="id-2-mysql-veritaban-ba-lant-s"></a>

Artık veritabanımıza bağlantımızı yapacak bilgileri oluşturmanın zamanı geldi. Bunun için aşağıdaki kod blokunu ekleyerek kullanıcı adı, şifre ve veritabanı adını kendinize göre düzenlemelisiniz:

```python
# Veritabanı bağlantı bilgileri
db = pymysql.connect(host='localhost',
                             user='dbkullaniciadi',
                             password='dbparolasi',
                             db='dbadı',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

```

### 2.3 İmleç Oluşturma

Veritabanına bağlandıktan sonra üzerinde işlem yapabilmek için **`cursor()`** fonksiyonu ile imleç oluşturmamız gerekiyor.

```python
imlec = db.cursor()
```

Eğer bilgiler doğruysa python dosyanızı çalıştırdığınızda bir hata almamanız gerekiyor. Boş bir çıktı görüyorsanız ilk iki aşamayı başarıyla geçtiniz demektir:

![Başarılı İşlem](/files/-Lw58P8cBquvkZ05_lOO)

### 2.4 \~SELECT\~ ile Tablodaki Verileri Seçmek <a href="#id-3-select-i-lemi" id="id-3-select-i-lemi"></a>

En çok kullanılan komut olan `SELECT` ile başlayalım. Bunun için ilk önce veritabanımızda örnek bir tablo oluşturalım. Örnek olarak **kullanicilar** isimli tabloyu oluşturmak ve basit olması için sadece `id`, `ad`, `yas` sütunlarını kullanmak istiyorum. İlk başta örnek olarak 2-3 tane veride ekleyebilirsiniz:

![kullanicilar isimli tablo](/files/-Lw58k6ydPLK9wogn66I)

Tablomuz ve örnek verilerimiz hazırsa sorgu kodumuzu hemen gönderelim:

```python
imlec.execute('SELECT * FROM kullanicilar')
```

Bu isteğin ardından dönen sonuçları (dizi olarak döner) bir değişkene aktarmamız gerekiyor. Bunun içinde aşağıdaki gibi bir eşitleme yapıyoruz:

```python
kullanicilar = imlec.fetchall()
```

Artık tablomuzdaki kullanıcılarımızı bir değişkene atadık ve sıra ekrana yazdırmaya geldi. Bunun için **foreach** döngümüzü kullanarak dönen diziyi ekrana yazdırıyoruz:

```python
for i in kullanicilar:
    print(i)
```

Ekran çıktımız şu şekilde olacaktır:

![Döngü sonucu](/files/-Lw59AHdq469Ws3CY3mc)

Eğer dönen sonuçları daha detaylı kullanmak istiyorsanız sütun isimlerini kullanarak ekrana yazdırabilirsiniz. Bunun için:

```python
for i in kullanicilar:
    print("Ad: " + i['ad'] + " --- " + "Yaş: " + str(i['yas']) )
```

Ekran çıktımız şu şekilde olacaktır:

![](/files/-Lw59Tgw72fA83gy4f0-)

&#x20;Özet olarak **execute** fonksiyonu ile hangi komutu gönderirseniz dönen sonuçlar komutun çıktısı olacaktır. Sizlerde istediğiniz komutları yukarıdaki örnekteki gibi gönderebilirsiniz.

### 2.5 \~INSERT\~ ile Yeni Veri Ekleme İşlemi <a href="#id-4-insert-i-lemi" id="id-4-insert-i-lemi"></a>

Tablomuza yeni bir kullanıcı eklemek istediğimizde kullanmamız gereken kod `INSERT` komut yapısı aşağıdaki gibidir:

```python
sonuc = imlec.execute('INSERT INTO kullanicilar VALUES(%s,%s,%s)',(None,'Özlem',25))
db.commit()

print(str(sonuc) + " kullanıcı eklendi")
```

Sonucumuza bakarsak:

![](/files/-Lw59kE4gjph1eaqPcSD)

![](/files/-Lw59oFeQCjCGhSzLLm2)

Yukarıdaki kodda **`%s`** ile göndereceğimiz değerleri belli ediyoruz. Tablomuzda id,ad ve yas sütunları olduğu için **`%s`** ile belirlediğim değişkenleri bir sonraki parametrede yazarak gönderiyoruz. Yani **insert** işleminin kabaca syntax yapısı şu şekildedir:

> imlec.execute = (**SQL Komutu**,**Değişkenler**)

Bu fonksiyon çalıştığında etkilenen girdi sayısını da **sonuc** değişkenimize aktarıyoruz. Bu **sonuc** değişkeni ile tabloya veri eklenip eklenmediğini kontrol edebilirsiniz. Eğer sonuç 0 ise tabloya eklenememiştir.

En önemli kısmına gelirsek te **`db.commit()`** ile yaptığımız değişiklikleri veritabanına ileterek **insert** işlemini gerçekleştiriyoruz. Eğer `commit()` işlemini yapmazsanız insert işlemleriniz gerçekleşmez!

Unutmadan söyleyelim ki **None** değerini tablodaki **id** sütunumu auto increment ayarladığım için boş gönderiyorum, böylece veri eklediğimde id değeri otomatik olarak 1 artıyor.

### 2.6 \~UPDATE\~ ile Veri Güncelleme İşlemi <a href="#id-5-update-i-lemi" id="id-5-update-i-lemi"></a>

Şimdi geldik tablomuzdaki mevcut bir değeri güncellemeye. Bu işlem için `UPDATE` komutunu kullanacağız. Aşağıdaki örneği hemen incelemeye başlayabilirsiniz

```
sonuc = imlec.execute('UPDATE kullanicilar SET yas = %s WHERE id = %s',(50,5))
db.commit()

print(str(sonuc) + " kullanıcı güncellendi")
```

Bu işlemin sonucunda ekran çıktılarımız şu şekilde olacaktır:

![](/files/-Lw5AsXB-F2Xz9EZSRWW)

![](/files/-Lw5AuOnoacmtae1iMJB)

Gördüğünüz gibi klasik Update komutumuzu gönderdik ve işin kritik noktası olan `commit()` ile işlemlerimizi başarıyla tamamladık. Artık sıradaki işlemimize geçebiliriz.

![](/files/-Lw5B5XXhnpSYldIP1U8)

![](/files/-Lw5B80z5itLJPXr9m6C)

Tablomuzdaki kayıt başarıyla silinmiş.

### 2.7 \~DELETE\~ ile Veri Silme

Tablomuz üzerindeki bir veriyi silmek için **`DELETE`** sql komutunu kullanmalıyız. Örnek olarak aynı tablo üzerinde yer alan *Yunus* kullanıcısını silelim.

```
sonuc = imlec.execute('DELETE FROM ogrenciler WHERE ad= %s',('Yunus'))
db.commit()
```

### 2.8 Veritabanı Bağlantısını Kapatmak

Veritabanı üzerindeki işlerinizi tamamladığınızda veritabanı bağlantısını sonlandırmak için **`close()`** fonksiyonunu kullanmalısınız.

```python
db.close()
```

## 3. Özet

Tüm işlemleri kısaca özetlersek sırasıyla şu işlemleri yapmalısınız.

1. `pymysql.cursors` modülünü projenize dahil edin
2. Veritabanınızı `connect()` fonksiyonu ile bağlayın
3. `cursor()` fonksiyonu ile imleç oluşturun
4. Sql komutlarınızı `execute()` fonksiyonu ile işletin.
5. Veritabanınızda değişiklik olacaksa `commit()` edin.
6. Veritabanı bağlantınızı `close()` ile sonlandırın.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://derslik.kerteriz.net/python-dersleri/veritabani-islemleri/python-mysql-veritabani.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
