3 min read

Python 3 MySQL Veritabanı İşlemleri

Python 3 ile MySQL veritabanı kurulumunu önceki yazımızda bahsetmiştik. Bu yazımızda ise PyMySQL kullanarak basit veritabanı işlemleri yapacağız. Örnek amaçlı sorgular oluşturacağımız için basit bir veritabanı oluşturup bunun üzerinde işlemler gerçekleştireceğim.

  • Veritabanı adımız: python3
  • Kullanıcı adı: root
  • Kullanıcı şifresi: 123456
  • Socket Yolu: /var/run/mysqld/mysqld.sock
  • Host: 127.0.0.1

python3 isimli veritabanında kullanici ve yazi olmak üzere 2 adet tablo mevcut.

İlk bağlantımızı oluşturalım:

#!/usr/bin/env python3

import pymysql

try:
    baglanti = pymysql.connect(host = '127.0.0.1', unix_socket = '/var/run/mysqld/mysqld.sock', user = 'root', passwd = '123456', db = 'python3', autocommit=True, charset='utf8')
    baglanti = baglanti.cursor()
    baglanti.execute('SET NAMES UTF8')
except:
    print("Veritabanı Bağlantı Hatası")
    exit()

MySQL bağlantısı sırasında eğer ki herhangi bir hata oluşursa programımız çıkış yapacaktır. Burada “SET NAMES UTF8″ gibi bir sorgu mevcut. Bu sorgu veritabanında UTF8 karakterlerin kullanımına izin veriyor. charset ise insert veya update ederken Türkçe karakter problemi yaşamamak için kullanıyoruz. autocommit ise her update, insert’den sonra verilerin otomatik olarak database’e yazılmasını sağlar. Eğer bu işi manuel yapmak isterseniz ki tavsiye etmiyorum bunun için her update ve insert’den sonra;

baglanti.commit()

yapmanız gerekecektir.

Veritabanına Sorgu Gönderme, Eklenen Satırın ID’sini Alma

 

#!/usr/bin/env python3

import pymysql

try:
    baglanti = pymysql.connect(host = '127.0.0.1', unix_socket = '/var/run/mysqld/mysqld.sock', user = 'root', passwd = '123456', db = 'python3', autocommit=True, charset='utf8')
    baglanti = baglanti.cursor()
    baglanti.execute('SET NAMES UTF8')
except:
    print("Veritabanı Bağlantı Hatası")
    exit()


# Sorgu oluşturuluyor
sorgu = "INSERT INTO kullanici (adi, soyadi, yas) VALUES ('{adi}', '{soyadi}', {yas})".format(adi = 'Enes', soyadi = 'Gür', yas = 18)

# Sorgu veritabanına gönderildi.
baglanti.execute(sorgu)

# Eklenen kayıta ait satır numarası
sorgu_satiri = baglanti.lastrowid
print("Kullanıcı eklendi, eklenen satır ID'si {id}".format(id = sorgu_satiri))

# Satır numarasına ait kullanıcının bilgilerini çeken sorgu oluşturuldu.
sorgu = "SELECT * FROM kullanici WHERE id = {id}".format(id = sorgu_satiri)

# Sorgu veritabanına gönderildi.
baglanti.execute(sorgu)

# Sorgu sonucunda gelen tüm veriler "kisi" adlı değişkene atıldı.
kisi = baglanti.fetchall()
print("ID'si {id} olan kullanıcıya ait bilgiler \n {kisi}".format(id = sorgu_satiri, kisi = kisi))

# Bağlantı Kapatıldı.
baglanti.close()

sorgu isimli değişkene basit bir sorgu atadık, daha sonra baglanti isimli veritabanı sınıfıyla execute ettik. Autocommit True olduğu için ekleme işlemi otomatik olarak gerçekleşti. Eklenen kayıta ait satır numarasını ise yine baglanti veritabanı sınıfının lastrowid değişkeninden aldık.

 

Sorgunun İlk Satırını ve Tüm Satırlarını Çekme

Veritabanından çekilen veriler satır satır işlenir bu nedenle çektiğimiz verileri ekrana basarken bir döngü içerisinde yada metotlar kullanarak listeleyebiliriz. Sorgu sonucunda dönen tüm satırları görmek için fetchall metodunu, ilk satırı almak için ise fetchone metodunu kullanabiliriz.

#!/usr/bin/env python3

import pymysql

try:
    baglanti = pymysql.connect(host = '127.0.0.1', unix_socket = '/var/run/mysqld/mysqld.sock', user = 'root', passwd = '123456', db = 'python3', autocommit=True, charset='utf8')
    baglanti = baglanti.cursor()
    baglanti.execute('SET NAMES UTF8')
except:
    print("Veritabanı Bağlantı Hatası")
    exit()


# Sorgu oluşturuluyor
sorgu = "SELECT * FROM kullanici"

# Sorgu veritabanına gönderildi.
baglanti.execute(sorgu)

# İlk satır çekilir.
ilk_satir = baglanti.fetchone()
print('Kullanıcılar tablosuna ait ilk satır', ilk_satir)

# Tüm satırlar çekilir.
tum_satirlar = baglanti.fetchall()
print('Kullanıcılar tablosuna ait tüm veriler', tum_satirlar)

# Bağlantı Kapatıldı.
baglanti.close()

Ekran Çıktısı:

Kullanıcılar tablosuna ait ilk satır (1, 'Osman', 'Erdoğan', 29)
Kullanıcılar tablosuna ait tüm veriler ((2, 'Enes', 'Gür', 18), (3, 'Ethem', 'Gür', 18))

Burada dikkat edilmesi gereken nokta, fetchone metodu ile ilk satır çekildikten sonra bu veriler veritabanı sınıfından siliniyor. Daha sonra fetchall kullandığımızda ilk satırın gözükmemesinin sebebi buydu. Aynı sorguyu fetchone’dan sonra gönderdiğimizde ise;

# Sorgu oluşturuluyor
sorgu = "SELECT * FROM kullanici"

# Sorgu veritabanına gönderildi.
baglanti.execute(sorgu)

# İlk satır çekilir.
ilk_satir = baglanti.fetchone()
print('Kullanıcılar tablosuna ait ilk satır', ilk_satir)

# Sorgu yeniden gönderiliyor.
baglanti.execute(sorgu)

# Tüm satırlar çekilir.
tum_satirlar = baglanti.fetchall()
print('Kullanıcılar tablosuna ait tüm veriler', tum_satirlar)

# Bağlantı Kapatıldı.
baglanti.close()

Çıktısı;

Kullanıcılar tablosuna ait ilk satır (1, 'Osman', 'Erdoğan', 29)
Kullanıcılar tablosuna ait tüm veriler ((1, 'Osman', 'Erdoğan', 29), (2, 'Enes', 'Gür', 18), (3, 'Ethem', 'Gür', 18))

Şeklinde olacaktır.

Peki ya sadece belirli miktarda bir veri çekmek istersek? Bunun için ise fetchmany metodunu kullanabiliriz. Fetchmany metodu dönen sorgudan verilen sayı kadar satır çeker. Yani dönen sorguda 50 satır veri varsa bunun ilk 5’ini fetchmany(5) şeklinde çekebiliriz.

# Sorgu oluşturuluyor
sorgu = "SELECT * FROM kullanici"

# Sorgu veritabanına gönderildi.
baglanti.execute(sorgu)

# Dönen sorgudan ilk 2 satır çekiliyor.
veriler = baglanti.fetchmany(2)

print(veriler)

# Bağlantı kapatılıyor.
baglanti.close()

Çıktısı;

((1, 'Osman', 'Erdoğan', 29), (2, 'Enes', 'Gür', 18))

iki adet liste döndü beklediğimiz gibi.