Veri Tabanı İşlemleri | Tablo Oluşturma

Bu bölümde hem kodlar ile yeni bir veri tabanı oluşturmayı hem de o veri tabanına tablo eklemeyi göreceğiz. Bu noktada yapacağımız şey, basit bir telefon rehberi oluşturmak olacak. Tablomuz ise, aşağıdaki Excel görüntüsü gibi bir görüntüye sahip olacak:

Şimdi, databaseOperations isimli bir klasör açıyorum, içerisine database.py isimli bir Python dosyası oluşturuyorum ve bu klasörü VSCode üzerinde açıyorum.

Yapmamız gereken ilk şey, import sqlite3 komutunu vererek sqlite modülünü/kütüphanesini içe aktarmak olmalıdır.

Veri tabanına uzaktan erişeceğimiz için bir bağlantı kurmamız gerekiyor. Bunun için connection isimli bir değişken belirleyip ona sqlite3 içerisinde bulunan connect() fonksiyonunu atıyorum. Zaten 'Connect' kelimesinin Türkçe karşılığı da 'Bağlamak' şeklindedir. 

Aslında bağlantımızı oluşturacak bir alt yapımız mevcut. Ancak, bu bağlantı hangi veri tabanında oluşturulacak? Bunun için connect() fonksiyonu içerisine bir veri tabanı ismi girmemiz gerekiyor. Bu sayede Python, hangi veri tabanına bağlanacağını öğrenecek ve ona göre hareket edecektir.

Gördüğünüz üzere connect() fonksiyonunun içerisine tırnak işaretleriyle beraber bir veri tabanı ismi girdim. Python bunu görünce bulunduğu klasörde contact.db isimli bir veri tabanı arayacaktır. Eğer böyle bir veri tabanı yoksa bunu kendisi oluşturacaktır. Eğer böyle bir veri tabanı zaten varsa direkt olarak bağlanıp işlemleri yapmamıza olanak tanıyacaktır. Eğer işlem yapmak istediğiniz veri tabanı, çalışma dizininizde yani aynı klasörde değilse o veri tabanının yolunu (path) girerek bu işlemi yapmanız lazım. Örneğin; C:/Python/contact.db.

Peki, şu an bir bağlantı söz konusu. Bunun yanında bir de bir imlece ihtiyacımız olacaktır. Bu imleç sayesinde veri tabanı içerisindeki yapıları kolayca kontrol edebileceğiz. Bunun için sqlite3 içerisinde bulunan cursor() isimli fonksiyonu kullanıyorum. Zaten 'Cursor' kelimesinin de Türkçe karşılığı 'İmleç' şeklindedir.

O zaman connect() fonksiyonu için yaptığımızın benzerini cursor() fonksiyonu için de yapalım. Bunun için myCursor isimli bir değişken belirleyip karşılığını veriyorum:

Çok dikkat edelim. myCursor isimli değişkene sqlite3.cursor() ifadesini vermek yerine connection.cursor() ifadesini verdik. Daha önce, modülleri öğrenirken bazı nesneler oluşturmuş ve bu nesnelerin, modülün özelliklerini aldığından söz etmiştik. Aynı şeyi burada görüyoruz. Biraz önce connection = sqlite3.connect() ifadesi ile aslında connection değişkenine bu özellikleri vermiş olduk. Şimdi connection.cursor() dememizin sebebi de budur. Ayrıca biz zaten sqlite3 modülü ile veri tabanıyla bağlantı sağlamıştık. Şimdi, connection değişkeni ile bağlantı sağlanan bu veri tabanında işlem yapabilmemiz için connection değişkeni üzerinde işlem yapmamız gerekir, öyle değil mi? İşte, bu yüzden connection.cursor() ifadesini verdik.

Buraya kadar her şey tamamsa şimdi bu bağlantıyı sonlandırmamız gerekiyor. Bunun için yine sqlite3 içerisinde bulunan close() fonksiyonunu kullanıyoruz.

Yine dikkat edelim. Bizim bu noktada cursor yani imleç ile bir işimiz yok; biz, bağlantının kendisini sonlandıracağımız için myCursor.close() demek yerine connection.close() diyoruz. Buraya kadar basit bir temel aldık. Şu an hâlihazırda benim contact.db isimli bir veri tabanım olmadığını bilin. Şimdi, bu kodu çalıştırıp ne olacağını görelim.

Sol tarafa dikkat ederseniz kodu çalıştırdığım zaman contact.db isimli bir dosya oluşturuldu. Biraz önce sözüne ettiğim gibi, eğer tekrar bu kodu çalıştırırsam bir sorun olmayacak, bağlantı tekrar kurulacaktır.

Şimdi, tabloyu nasıl oluşturacağız?

Bunun için iki temel komutumuz var:

1. CREATE TABLE <tablo ismi>

2. CREATE TABLE IF NOT EXISTS <tablo ismi>

Peki, bunların arasında nasıl bir fark var? Bunların anlamlarını bilmiyorsanız hemen basit bir çeviri programı açıp bunların ne olduğunu görebilirsiniz:

Demek ki birincisi direkt olarak tabloyu oluşturmaya çalışırken ikincisi ismini verdiğimiz tablo eğer mevcut değilse oluşturulacaktır. Eğer sade CREATE TABLE ile var olan bir tabloyu tekrardan oluşturmak isterseniz hata alacaksınızdır. Bu kodları denemek için yapmamız gereken şey imleç ile oynamaktır. İmleç sayesinde veri tabanında türlü işlemler yapabiliyoruz; söylemiştim. Bu noktada myCursor dedikten sonra execute() isimli bir fonksiyonu kullanacağız. Zaten 'Execute' kelimesinin anlamı 'Uygula/Çalıştır' şeklindedir.

myCursor.execute() dedikten sonra biraz önceki komutlarımızı bu parantezler arasına girmemiz gerekecektir. Bakalım.

Komutu girdim. Dikkat ederseniz hepsi büyük harflerle yazılmış ve herhangi bir Türkçe karakter mevcut değil. Buna dikkat etmezseniz hata üstüne hata alacaksınızdır. Çünkü bunlar, başlangıç blogunda söz ettiğim SQL dilinin syntax yapısıdır.

Dikkat etmeniz gereken diğer bir nokta ise komutlarımızı connection.close() kodunun üzerine yazıyor olmamızdır. Bağlantının koparılması en son yapılacak iştir.

Şimdi, tablomuzu oluşturduk ve adına contacts dedik. Peki, gösterdiğim Excel dosyasında gördüğünüz gibi ID, İsim, Soyisim, Numara gibi özellikleri tanımlamamız gerekiyor. Bunu nasıl yapacağımızı görelim.

Dikkatli bakalım.

CREATE TABLE IF NOT EXISTS contact dedikten sonra bir parantez açıyoruz ve gerekli sütun isimlerini giriyoruz.

CREATE TABLE IF NOT EXISTS contact (...)

Bu noktada INT ifadesi bildiğiniz integer veri tipi iken TEXT ifadesi string veri tipidir ve hepsi büyük harflerle, Türkçe karakter olmadan kullanılmalıdır. Dediğim gibi; SQL syntax yapısı böyle.

id isimli değişkenimiz zaten integer olacaktır ve bu, bir tanımlayıcı/identifier olduğu için veri tabanı içerisinde birincil anahtar olarak geçecektir. Telefon numarasını ifade eden number değişkeninin INT olmamasının sebebi ise hafızadaki alandır. BIGINT dediğimiz bir veri tipini kullanmak istemediğim için direkt olarak TEXT yazdım. Bunları apayrı bir şekilde SQL ile işlememiz gerektiği için çok detaylı anlatmıyorum. Yakalamanız gereken nokta; parantezler arasına değişken adı ve veri tipi girdiğimizdir.

Şimdi, kodu çalıştıralım:

Gördüğünüz üzere herhangi bir hata almadık. Bir de sqlite programını açıp neler olduğuna bakalım.

Gördüğünüz üzere Tables (1) kısmında bizim bir adet tablomuz olduğunu gösteriyor. Hemen altında da bu tablonun adının contacts olduğunu gösterirken son olarak içerisindeki sütunları gösteriyor.

Her şey çok güzel. Ancak, basit bir noktayı atladık. Biz execute() ile bu komutu uyguladıktan sonra bir de bunu işlememiz gerekir. Normal şartlarda bunu yapmazsanız hata almazsınız ama kodun daha sağlıklı olması açısından bunu yapmanız elzemdir. Nasıl olduğunu görelim.

Bunu, commit() fonksiyonu ile yapıyoruz. Anlamı, 'İşle' şeklindedir. execute() ile çalıştırmak istediğiniz her komuttan sonra commit() demenize gerek yoktur. Komutları yazdıktan sonra en son satıra bir defa connection.commit() demeniz uygun olacaktır.

Peki, neden myCursor.commit() değil de connection.commit() dedik? Dikkat edelim; bağlantıyı oluşturduk ve bir komut sayesinde veri tabanıyla oynadık. Biz zaten komutun çalışması için myCursor isimli imleci kullandık. Sonrasında bu bağlantının güncel kalabilmesi için connection.commit() dedik ve bağlantıyı güncel hâle getirmiş olduk.

İşte, Python ile bir veri tabanı oluşturmak ve o veri tabanına tablo koymak bu şekilde gerçekleşiyor. Son olarak; aynı tablo ismi ile CREATE TABLE komutunu kullanmayı deneyelim.

OperationalError yani 'Operasyonel Hata' şeklide bir hata aldık. Bize şunu diyor: "Zaten contacts isminde bir tablon mevcut." İşte, var olan bir tabloyu sade bir şekilde CREATE TABLE ile tekrar oluşturmayı denerseniz bu şekilde bir sorunla karşılaşırsınız.

Madem öyle, o zaman bu komut neden var? Bu komutu daha çok, kontrol sistemleri için kullanıyoruz. Örneğin kullanıcı bir tablo oluşturmak istiyorsa biz, try-except blokları ile bu hatayı yakalar, hatanın gelmesi durumunda kullanıcıya yol gösterebiliriz. Yahut, devasa bir veri tabanı içerisinde aradığınız spesifik bir tablo varsa bu komut, onun orada olup olmadığını size gösterebilir. İlerleyen bölümlerde bunları daha detaylı göreceğiz.


Yayınlanma Tarihi: 2023-01-23 15:52:22

Son Düzenleme Tarihi: 2023-01-28 13:18:50