Python ile Sqlite Veritabanı Programlama

0x1D

Kıdemli Üye
23 Nis 2020
2,650
78
MARS


Bugün Python ile bir Sqlite veritabanında veri girme, silme, günceleme, sıralama gibi işlemler yapacağız. Verileri daha düzenli bir şekilde görmek için aşağıda sitesini vermiş olduğum programı kullanıyorum. Bu işlemleri yapmak için sqlite modülünü indirmiş olmamız lazım. Yaptığım her şeyi açıklayarak yapacağım. Bir sorunuz veya hatanız var ise yazabilirsiniz.



Başlıklar

Ne Yapacağımız Hakkında Güzel Bir Benzetme
Modülü İmport Etmek
Veritabanına Bağlantı Kurma
Cursor/İmleç Oluşturalım
Bir Tablo Oluşturalım
Tablomuza Veri Girelim
Veri Silelim
Veri Güncelleme
Veritabanından Seçim Yapalım
Veri Filtreleme
Verilerimizi Sıralayalım
Dışardan veri alarak işlem yapmak istersek
Güvenlik ve Bu Konu Hakkında
Yararlı Linkler


https://sqlitebrowser.org/dl/

>> Ne Yapacağımız Hakkında Güzel Bir Benzetme <<



Diyelim ki elinizde bir defter var. Deftere resim çizmek için öncelikle defteri açmamız lazım. Defteri açtıktan sonra bir karalama yapmamız lazım. Çizeceklerimizin taslağını oluşturduktan sonra silinmemesi için keçeli kalem ile üstünden geçmemiz lazım. İşte biz bu aşamaların aynısını sanal ortamda kodlarımız ile yapacağız. Bu örnek bu işlemleri daha iyi anlamanızı sağlayacaktır.



>> Modülü İmport Etmek <<

Öncelikle modülümüzü import ediyoruz. Bu aşamayı defteri elimize almak gibi düşünebiliriz.

Kod:
import sqlite3

Modülümüzü import ettik ama ben her çağırdığımda sqlite3 yazmak istemiyorum. Bu yüzden sqlite modülümü farklı bir ad ile içe aktaracağım.



Kod:
import sqlite3 as sql


Artık sqlite3 yerine "sql" yazmamız yeterli olacak. "sql" dışında bir şey de yazabilirsiniz ama ben şu an çok alakasız şeyler yazmak istemiyorum. Eğer çok üşengeçseniz "a" vs. de yazabilirsiniz ama bunu tavsiye etmem.



>> Veritabanına Bağlantı Kurma <<



Defteri elimize aldık ve şu an defteri açıyoruz.
Şimdi isterseniz sqlite3 veritabanımıza bağlantımızı kuralım. Bunu şu şekilde yapabiliriz :



Kod:
db = sql.connect('veritabanı yolu/veritabanı adı')



Bağlantımızı kurduk ve bu bağlantıyı "db" değişkenine atadık.


Şu şekilde diskimizin üzerinde geçici bir veritabanı oluşturabiliriz :



Kod:
db = sql.connect(':memory:')


>> Cursor/İmleç Oluşturalım <<

Defteri aldık ve açtık. Şimdi de karalama yapmak için elimize bir kalem alalım.

Kod:
cursor = db.cursor()



cursor değişkenimizi imleç olarak ayarladık ve şimdi yapacağımız yazma, silme, güncelleme gibi işlemlerimizi bu kalem ile yapacağız.



>>Bir Tablo Oluşturalım<<




Kod:
cursor.execute("CREATE TABLE tablo_ismi (sütun1,sütun2,sütun3)")



Bu şekilde yaptığımızda tablo_ismi adında üç sütunlu bir tablo oluşturacak.

Eğer bu kodu ikinci kez çalıştırırsanız şu şekilde bir hata veriyor :



sqlite3.OperationalError: tablo_ismi skor already exists


Bu hatayı sqlite3 modülünün bize sunduğu bir kod ile çözüyoruz: IF NOT EXISTS :


Kod:
cursor.execute("CREATE TABLE IF NOT EXISTS tablo_ismi (sütun1,sütun2,sütun3)")


Şimdi biz bir skor sistemi yapalım. Skor adında bir table oluşturalım nick,skor, sütunlarını ekleyelim.


Kod:
cursor.execute("CREATE TABLE skor(nick,skor)")


Evet tablomuzu oluşturdum. Veri girme işlemlerini bu tablo üzerinden anlatacağım.


>>Tablomuza Veri Girelim<<


Eveet şimdi her şey hazır, kalemimiz elimizde başlayalım çizmeye.
Öncelikle Tablomuz bizden bir nick ve puan istiyor. Yani bizim 2 eleman girmemiz lazım.
Öncelikle karşılaşacağımız hatalara bakalım :

Eğer eksik eleman girersek :




Kod:
cursor.execute("INSERT INTO skor VALUES ('hkey')")


sqlite3.OperationalError: table skor has 2 columns but 1 values were supplied



Bize : Skor tablosu iki kolona sahip ama sen bir tane değer girdin ne ayaksın ? diyor. Ve biz de heyecandan ne yapacağımızı şaşırıyoruz ve bu sefer yanlışlıkla üç eleman giriyoruz.



Kod:
cursor.execute("INSERT INTO skor VALUES ('hkey','654','aa')")



sqlite3.OperationalError: table skor has 2 columns but 3 values were supplied

Aslında hatalarda tek değişen şey sayılar. Daha fazla kızdırmadan doğru sayıda eleman girelim ve bakalım.

Kod:
cursor.execute("INSERT INTO skor VALUES ('hkey','654')")



Bu kodu çalıştırdığımızda bize hiç bir hata vermedi. Bakalım verilerimizi girmiş mi ?

unknown.png


Çok güzel ! Tablomuzu oluşturmuş. Bakalım verilerimizi girmiş mi ?



unknown.png


O da ne ? Verilerimizi girmemiş. Neden ola ki ? Bir düşünelim, defteri açtık, sayfamızı açtık, kalemi elimize aldık, hatta yazımızı da yazdık. Aa taslak çizimimizin üstünden geçmemişsiz, üstünden geçmediğimiz için de kayboluvermiş. O zaman biz bunun üstünden güzel bir kalemle geçelim değil mi ?

Kod:
db.commit()
Böylece taslağımızın üstünden geçtik ve kaydettik. Şimdi bakalım yazmış mı ?

unknown.png


Şükürler olsun ki yazdırabildik.

>>Veri Silelim<<

Verileri silmek gerekebilir ve bunları bazı kriterlere göre yapmamız gerekebilir:


Kod:
cursor.execute("DELETE FROM skor WHERE nick = 'hkey' ")

Bu kod ile skor tablosundaki nicki hkey olan tüm verileri sildim. Nicki hkey olan bir veri olduğu için sadece o veri silindi.


unknown.png





unknown.png



>>Veri Güncelleme<<

Veriler üzerinde değişiklik yapmak gerekebilir. Bazen boş değerleri doldurmak bazen de dolu değerleri değiştirmek olarak karşımıza çıkabilir.

Kod:
cursor.execute("UPDATE skor SET skor = '1000' WHERE nick = 'hkey'")

Burada skor tablosunda nick değeri hkey olan satırların skor değerini 1000 yaptım.


unknown.png




unknown.png



>>Veritabanından Seçim Yapalım<<

Defterimizde bir sürü resim var. Bunlardan belli kriterlere uyanları seçmek istiyorsunuz. Örneğin : doğa ile ilgili resimlerinizi ayrı bir yerde tutacaksınız veya çevrecilik haftasında sosyal medyada paylaşacaksınız...

Kod:
cursor.execute("SELECT * FROM skor")

Bu şekilde skor tablosundaki her şeyi seçtim. İsterseniz oraya bir sütun adı yazabilirsiniz. Şimdi bunları bir değere atayalım ki uçup gitmesinler değil mi ?

Kod:
skorlar = cursor.fetchall()


İsterseniz fethone() ile birer birer alabilirsiniz :

Kod:
cursor.fetcone()

fetchmany() Metodu ile istediğimiz sayıda veri alabiliriz. Tablodaki veri sayısından fazla girerseniz hata verecektir.

Kod:
cursor.fetchmany(2)

>>Veri Filtreleme<<


Veritabanımızdaki verileri süzebiliriz.

Kod:
cursor.execute("SELECT * FROM tablo_adi WHERE sütun = aranan")

Bu kod ile tablo_adi tablosundaki sütun değeri aranan'a eşit olan verileri çektik. Bu sorguda yukarda anlattığım fetch'lerin hepsini kullanabilirsiniz. || Aslında dümdüz İngilizce kullanıyoruz.


>>Verilerimizi Sıralayalım<<

Bazen verilerimizi sıralamak gerekebilir bunu için aşağıdaki kodu kullanabilirsiniz.
Kod:
imlec.execute(f"SELECT ne_seçilecek FROM tablo_adi ORDER BY neye_göre sıralanacak DESC")

Bu kod : tablo_adi tablosundaki verileri neye_göre'ye göre sıralayarak ne_seçilecek değerlerini çekiyor.

>>Dışardan veri alarak işlem yapmak istersek<<

Bir fonksiyon oluşturuyorsanız, değer dışardan girilecekse ne yapabilirsiniz göstereyim :

Kod:
a = 'nick'
b= 'puan'
cursor.execute("INSERT INTO skor VALUES ((?),(?))",(a,b))
En sonda veritabanımızı kapatabiliriz :

Kod:
db.close()

>>Güvenlik ve Bu Konu Hakkında <<

Veritabanlarımızda işlemler yaparken güvenliğe dikkat etmemiz gerekir. Sql açıkları başımıza bela olabilir. Ben bunları burada anlatmayacağım ama araştırmanız gereken önemli bir konu. Konu altına yararlı linkler (yazılar,videolar) bırakacağım onları da izleyip okuyabilirsiniz. Ne kadar pratik yaparsanız o kadar iyi öğrenirsiniz. Eğer bir hatanız var ise mutlaka ama mutlaka yazın. Eğer aklınızda soru kalırsa ilerde sizi rahatsız edebilir. Sorun sorunuzu rahatlayın. Konu ile ilgili görüşünüzü aşağı yazabilirsiniz.


Şu kodları da şöyle bırakayım :

Kod:
import sqlite3 as sql


db = sql.connect('deneme.sqlite')

cursor = db.cursor()

cursor.execute("CREATE TABLE IF NOT EXISTS skor(nick,skor)")
a = 'hkey'
b= '656'
cursor.execute("INSERT INTO skor VALUES ((?),(?))",(a,b))
cursor.execute("UPDATE skor SET skor = '10000' WHERE nick = 'hkey'")


cursor.execute("SELECT * FROM skor")
skorlar = cursor.fetchall()

cursor.execute("SELECT * FROM tablo_adi WHERE sütun = aranan")
db.commit()

>>Yararlı Linkler<<

https://www.sqlite.org/index.html
https://docs.python.org/3/library/sqlite3.html
https://python-istihza.yazbel.com/standart_moduller/sqlite.html
[ame]https://www.youtube.com/watch?v=nb0zQ-WEeV8&list=PLv5gvG08kLQdyIXAlzehJCsQISuRbi83G[/ame] (3 videoluk Python Sqlite oynatma Listesi)



 
Son düzenleme:

MendeburMarul

Katılımcı Üye
17 Haz 2020
659
0
Andromeda
tek sorum su:

neredeyse herkes db browser adli uygulamayi kullaniyor. Bunun alternetifini aradim ama pekte dogruduzgun bulamadim. Varmi bir oneriniz
 

0x1D

Kıdemli Üye
23 Nis 2020
2,650
78
MARS
tek sorum su:

neredeyse herkes db browser adli uygulamayi kullaniyor. Bunun alternetifini aradim ama pekte dogruduzgun bulamadim. Varmi bir oneriniz

Gayet güzel bir program. Neden bir alternatif arayalım ki ?

Sqlite viewer / sqlite browser yazarak ararsan bulabilirsin. Online viewerlar falan da var. Ama tabii ki db browser kadar değiller.
 

0x1D

Kıdemli Üye
23 Nis 2020
2,650
78
MARS
Eline sağlık dostum :))

Emeğine Sağlık


Ellerine Sağlık emek kokuyor

Gerçekten emek var konu emek kokuyor eline emeğine sağlık,Seviliyorsun :))

Eline emeğine sağlık


Teşekkürler :))
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.