# # Python SQLite Veritabanı

SQLite, hafif ve disk tabanlı bir veritabanı çözümüdür. Herhangi bir ayrı sunucu işlemine gerek kalmadan ve basit standart sql söz dizimi ile cihazların yerel hafızalarında bile kullanılabilir. Birçok dil ile kullanımı olduğu gibi Python ile de rahatlıkla entegre dilebilir.

## 1. SQLite Avantajları

* Bir modül olarak projenize rahatlıkla dahil edebilirsiniz
* Ayrı bir yazılım veya sunucu kurmanıza gerek yoktur.
* Veritabanını diskinizde saklayabilirsiniz ve kolaylıkla transfer edebilirsiniz.
* Söz dizimi oldukça basittir, rahat öğrenilebilir.
* Açık kaynak kodludur, istediğiniz düzenlemeleri yapabilirsiniz.

SQLite her ne kadar basit bir veritabanı gibi gözüksede oldukça güçlü bir veritabanıdır ve kullanımı yaygındır.

## 2. Veritabanı İşlemleri

Python ile SQLite veritabanı üzerinde yapacağımız işlemleri bu başlık altında sırasıyla işleyeceğiz. Fakat öncesinde **`sqlite3`** modülünü projenize dahil etmelisiniz.

```python
import sqlite3
```

Ardından işlemlerimize geçebiliriz.

### 2.1 Veritabanı Oluşturma

İlk olarak yeni bir veritabanı oluşturmak veya mevcut  bir veritabanına bağlanmak için **`connect()`** fonksiyonunu kullanmalıyız. Bağlanacağımız veritabanı mevcut değilse otomatik olarak oluşturulacaktır.

```python
db = sqlite3.connect('veritabanı_adı.db')
```

{% hint style="info" %}
SQLite veritabanı uzantısı herhangi bir terim olabilir. Genel olarak **`db`**, **`db3`**, **`sqlite`** ve **`sqlite3`** kullanılır ama siz başka bir isimde seçebilirsiniz. *(Örneğin veritabani.elma)*
{% endhint %}

Eğer isterseniz veritabanını tam adres göstererek de oluşturabilirsiniz.

```python
db = sqlite3.connect('/home/kerteriz/test.sqlite') #GNU/Linux
db = sqlite3.connect('c:/users/kerteriz/desktop/test.sqlite') #Windows
```

Aynı şekilde RAM veya sabit disk üzerinde geçici bir veritabanı da oluşturabilirsiniz.&#x20;

```python
db = sqlite3.connect(':memory:')    # RAM üzerinde geçici db
db = sqlite3.connect('')            # HDD üzerinde geçici db
```

{% hint style="info" %}
Daha çok test ortamları için kullanılan geçici veritabanları program sonlandırıldığında veya veritabanı bağlantısı kapatıldığında silinecektir.
{% endhint %}

### 2.2 İmleç Oluşturma

Yeni oluşturduğumuz veya mevcut olan bir veritabanına bağlandıktan sonra üzerinde işlem yapabilmek için **`cursor()`** fonksiyonu ile imleç oluşturmamız gerekiyor.

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

### 2.3 Yeni Tablo Oluşturma

SQL komutlarını oluşturabilmek için imlecimizle beraber **`execute()`** fonksiyonunu kullanmalıyız. Böylelikle tüm SQL komutlarını veritabanımız üzerinde çalıştırabiliriz.

```python
imlec.execute("CREATE TABLE ogrenciler(isim, yas)")
```

Artık veritabanımızda **ogrenciler** isimli ve iki sütunlu (isim,yas) bir tablo oluşturmuş olduk. Daha uzun komutlarınızı daha rahat okuyabilmek için `"""` işareti ile birden fazla satırda kullanabilirsiniz.

```python
imlec.execute(""""CREATE TABLE ogrenciler 
(isim, yas, sinif, veli, telefon, email)""")
```

Ayrıca daha rahat bir kullanım için sql komutlarınızı bir değişkene atayarak `execute()` fonksiyonuna da gönderebilirsiniz.

```python
komut = "CREATE TABLE ogrenciler(isim, yas)"

imlec.execute(komut)
```

{% hint style="warning" %}
Yukarıdaki yöntemlerle tablo oluşturduğunuzda tekrar aynı komutu çalıştırırsanız zaten bir kere oluşturulduğu için ***"sqlite3.OperationalError: table ogrenciler already exists"*** hatası verecektir.&#x20;
{% endhint %}

Uyarıda ki hatayı engellemek için tablo oluşturma komutunu **`IF NOT EXISTS`** ile güncelleyiniz. Böylece tablo zaten mevcutsa tekrardan oluşturulmaya çalışılmayacaktır.

```python
komut = "CREATE TABLE IF NOT EXISTS ogrenciler(isim, yas)"

imlec.execute(komut)
```

### 2.4 \~INSERT\~ ile Yeni Satır Ekleme

Tablomuza yeni veriler girebilmek için sql **`INSERT`** komutunu kullanmalıyız.

```python
komut = """INSERT INTO ogrenciler VALUES ('Yunus', 25)"""

imlec.execute(komut)
```

Aynı mantıkla komutumuzu yazdık ve imleç ile veritabanına işlettik. Fakat veritabanımızı kontrol ettiğinizde yeni verilerin eklenmemiş olduğunu göreceksiniz. Eğer yapılan değişikliklerin veritabanına uygulanmasını istiyorsanız **`commit()`** fonksiyonunu çalıştırmanız gerekiyor.

```python
db.commit()
```

Artık yeni verileri tablonuzda görebilirsiniz.

### 2.5 \~SELECT\~ ile Tablodaki Verileri Seçmek

Tablomuza örnek veriler ekledikten sonra bu verileri seçmek için **`SELECT`** komutunu kullanırız.

| isim  | yas |
| ----- | --- |
| Yunus | 24  |
| Ahmet | 30  |
| Deniz | 15  |

Örnek tablomuzdaki tüm verileri çekmek için öncelikle sql komutumuzu çalıştıralım ve ardından **`fetchall()`** fonksiyonu ile tüm verileri değişkenimize atalım. Ardından tüm verilerimiz demet halinde dönecektir.

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

veriler = imlec.fetchall()

print(veriler)    # [('Yunus', 25), ('Ahmet', 30), ('Deniz', 15)]
```

Tüm satırları çekmek istediğimizde **`for`** terimini de kullanabiliriz.&#x20;

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

for veri in imlec:
    print(veri)
    
# ('Yunus', 25)
# ('Ahmet', 30)
# ('Deniz', 15)
```

Eğer tek tek satır çekmek istiyorsanız bu sefer **`fetchone()`** fonksiyonunu kullanmalısınız. `fetchone()` fonksiyonu her çalıştığında sıradaki satırı çeker.

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

print(imlec.fetchone())    # ('Yunus', 25)
print(imlec.fetchone())    # ('Ahmet', 30)
print(imlec.fetchone())    # ('Deniz', 15)
```

Çektiğiniz tek bir satırın sütunlarına ulaşmak için demet elemanlarını kullanabiliriz.

```python
komut = """SELECT * FROM ogrenciler WHERE yas = {}""".format(15)

imlec.execute(komut)

veri = imlec.fetchone()

print("İsim: " + str(veri[0]))    # İsim: Deniz
print("Yaş: " + str(veri[1]))     # Yaş: 15
```

Tümünü veya tekini çekmek yerine belirlediğiniz adette satır çekmek için **`fetchmany()`** fonksiyonunu kullanabilirsiniz.

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

veriler = imlec.fetchmany(2)

print(veriler)    # [('Yunus', 25), ('Ahmet', 30)]
```

Adet sayısınca çekeceğiniz veriler üzerinde **`fetchone()`** fonksiyonu ile gezerken **`for`** döngüsünü de kullanabiliriz.

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

for veri in range(2):
    
    print(imlec.fetchone())
    
# ('Yunus', 25)
# ('Ahmet', 30)
```

### 2.6 \~UPDATE\~ ile Veri Güncelleme

Elimizdeki tabloda yer alan veriler üzerinde bir güncelleme yapmak istediğimizde **`UPDATE`** sql komutunu kullanırız. Örnek verirsek elimizde aşağıdaki gibi bir tablo olduğunu farzedelim.

| isim  | yas |
| ----- | --- |
| Yunus | 25  |
| Özlem | 15  |
| Ahmet | 30  |

Örnek tablomuz üzerindeki *Ahmet* isimli kullanıcının yaşını *50* olarak güncelleyelim.

```python
komut = "UPDATE ogrenciler SET yas = ? WHERE isim = ?"

imlec.execute(komut,(50,'Ahmet'))
db.commit()
```

Verileri **?** ile işaretleyip verileri **demet** halinde **`execute()`** fonksiyonuna vermemizin ardından hemen sonucu kontrol edelim.

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

veri = imlec.fetchall()

print(veri)    # [('Yunus', 25), ('Özlem', 15), ('Ahmet', 50)]
```

### 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.

```python
komut = "DELETE FROM ogrenciler WHERE isim = ?"

imlec.execute(komut,('Yunus',))
db.commit()
```

Tek elemanlı bir demet kullandığımız için elemandan sonra virgül koyuyoruz ve *Yunus* isimli satırı silmek istediğimizi söylüyoruz. Ardından sonucumuz şu şekilde oluyor.

```python
komut = """SELECT * FROM ogrenciler"""

imlec.execute(komut)

veri = imlec.fetchall()

print(veri)    # [('Özlem', 15), ('Ahmet', 50)]
```

### 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. SQLite Browser Kullanımı

SQLite Browser, elinizdeki veritabanı üzerindeki çalışmalarınızı bir arayüz üzerinden yapmanızı sağlar. Basit ve kullanışlı arayüzü ile tüm veritabanı işlemlerinizi rahatlıkla yapabilirsiniz.

![Sqlite Browser programının arayüzü](https://36478786-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LtGp1X8U6UM4fx3S9r1%2F-Lw-oP9pHaL5tb1Dx-Zh%2F-Lw-sC7V2C_KMgV6kFK6%2Fsqllitebrowser.png?alt=media\&token=0f596af4-5462-4b5b-b1ad-22d3d45954ab)

> SQLite Browser programını indirmek için [tıklayınız.](https://sqlitebrowser.org/dl/)

## 4. Özet

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

1. `sqlite3` modülünü projenize dahil edin
2. Mevcut veya yeni 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.
