{"id":36413,"date":"2025-12-16T01:41:34","date_gmt":"2025-12-15T22:41:34","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36413"},"modified":"2025-12-16T01:41:34","modified_gmt":"2025-12-15T22:41:34","slug":"python-3te-sqlite3-modulunu-kullanma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/","title":{"rendered":"Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi<\/h2>\n<p>SQLite, sunucusuz, kendi kendine yeten, s\u0131f\u0131r yap\u0131land\u0131rmal\u0131, i\u015flemsel bir SQL veritaban\u0131 motorudur. Hafifli\u011fi, kolay entegrasyonu ve kurulum gerektirmemesi sayesinde \u00f6zellikle masa\u00fcst\u00fc uygulamalar\u0131, mobil uygulamalar, web siteleri (d\u00fc\u015f\u00fck trafikli) ve geli\u015ftirme\/test s\u00fcre\u00e7leri i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr. Python&#8217;\u0131n standart k\u00fct\u00fcphanesinde yer alan <code>sqlite3<\/code> mod\u00fcl\u00fc, Python uygulamalar\u0131n\u0131zla SQLite veritabanlar\u0131 aras\u0131nda sorunsuz bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Bu rehberde, <code>sqlite3<\/code> mod\u00fcl\u00fcn\u00fcn temel ve ileri d\u00fczey kullan\u0131mlar\u0131n\u0131, pratik \u00f6rneklerle birlikte detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>SQLite3 Neden Kullan\u0131lmal\u0131?<\/h3>\n<p>Python projelerinizde <code>sqlite3<\/code> kullanmay\u0131 d\u00fc\u015f\u00fcnmeniz i\u00e7in birka\u00e7 iyi neden vard\u0131r:<\/p>\n<ul>\n<li><b>Kolay Kurulum:<\/b> Harici bir sunucuya veya karma\u015f\u0131k bir yap\u0131land\u0131rmaya ihtiya\u00e7 duymaz. Sadece bir dosya olarak veritaban\u0131n\u0131z\u0131 olu\u015fturabilirsiniz.<\/li>\n<li><b>Hafif ve H\u0131zl\u0131:<\/b> K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in olduk\u00e7a h\u0131zl\u0131 ve kaynak dostudur.<\/li>\n<li><b>G\u00f6m\u00fcl\u00fc Yap\u0131:<\/b> Uygulaman\u0131z\u0131n bir par\u00e7as\u0131 olarak da\u011f\u0131t\u0131labilir, bu da da\u011f\u0131t\u0131m ve y\u00f6netim maliyetlerini azalt\u0131r.<\/li>\n<li><b>Standart K\u00fct\u00fcphane:<\/b> Ekstra bir paket (pip install) kurmaya gerek yoktur, Python ile birlikte gelir.<\/li>\n<li><b>SQL Deste\u011fi:<\/b> Standart SQL sorgu dilini kullanarak veri manip\u00fclasyonu yapman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Veritaban\u0131na Ba\u011flanma ve Tablo Olu\u015fturma<\/h3>\n<p>Bir SQLite veritaban\u0131 ile \u00e7al\u0131\u015fmaya ba\u015flamak i\u00e7in \u00f6ncelikle ona ba\u011flanman\u0131z ve ard\u0131ndan \u00fczerinde i\u015flemler yapaca\u011f\u0131n\u0131z tablolar\u0131 olu\u015fturman\u0131z gerekir.<\/p>\n<h4>Veritaban\u0131na Ba\u011flanma<\/h4>\n<p><code>sqlite3.connect()<\/code> fonksiyonu ile bir veritaban\u0131 dosyas\u0131na ba\u011flan\u0131rs\u0131n\u0131z. E\u011fer belirtilen isimde bir dosya yoksa, otomatik olarak olu\u015fturulur.<\/p>\n<pre><code class=\"language-python\">\nimport sqlite3\n\n<h2>veritabani.db ad\u0131nda bir dosyaya ba\u011flan<\/h2>\n<h2>E\u011fer dosya yoksa, bu isimde yeni bir veritaban\u0131 dosyas\u0131 olu\u015fturulur.<\/h2>\n<h2>\":memory:\" kullanarak bellek i\u00e7i (ge\u00e7ici) bir veritaban\u0131 da olu\u015fturabilirsiniz.<\/h2>\ntry:\n    conn = sqlite3.connect('ornek_veritabani.db')\n    print(\"Veritaban\u0131na ba\u015far\u0131yla ba\u011flan\u0131ld\u0131.\")\nexcept sqlite3.Error as e:\n    print(f\"Veritaban\u0131na ba\u011flan\u0131rken hata olu\u015ftu: {e}\")\n\n<h2>Veritaban\u0131 \u00fczerinde i\u015flem yapmak i\u00e7in bir imle\u00e7 (cursor) nesnesi olu\u015fturulur.<\/h2>\n<h2>\u0130mle\u00e7, SQL komutlar\u0131n\u0131 y\u00fcr\u00fctmek ve sonu\u00e7lar\u0131 almak i\u00e7in kullan\u0131l\u0131r.<\/h2>\ncursor = conn.cursor()\n\n<\/code><\/pre>\n<h4>Tablo Olu\u015fturma<\/h4>\n<p>Ba\u011flant\u0131 kurulduktan sonra, SQL <code>CREATE TABLE<\/code> komutunu kullanarak tablolar\u0131n\u0131z\u0131 olu\u015fturabilirsiniz. <code>cursor.execute()<\/code> metodu, SQL sorgular\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">\n<h2>'kullanicilar' ad\u0131nda bir tablo olu\u015ftural\u0131m.<\/h2>\n<h2>id: Otomatik artan birincil anahtar<\/h2>\n<h2>ad: Metin t\u00fcr\u00fcnde, bo\u015f olamaz<\/h2>\n<h2>email: Metin t\u00fcr\u00fcnde, benzersiz ve bo\u015f olamaz<\/h2>\n<h2>yas: Tam say\u0131 t\u00fcr\u00fcnde<\/h2>\ntry:\n    cursor.execute('''\n        CREATE TABLE IF NOT EXISTS kullanicilar (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            ad TEXT NOT NULL,\n            email TEXT NOT NULL UNIQUE,\n            yas INTEGER\n        )\n    ''')\n    # De\u011fi\u015fiklikleri veritaban\u0131na kaydet (commit et)\n    conn.commit()\n    print(\"Kullanicilar tablosu ba\u015far\u0131yla olu\u015fturuldu veya zaten mevcut.\")\nexcept sqlite3.Error as e:\n    print(f\"Tablo olu\u015fturulurken hata olu\u015ftu: {e}\")\n\n<h2>\u0130\u015flem bittikten sonra ba\u011flant\u0131y\u0131 kapatmak \u00f6nemlidir.<\/h2>\n<h2>Ancak, \u015fimdilik a\u00e7\u0131k b\u0131rak\u0131yoruz ki sonraki i\u015flemleri yapabilelim.<\/h2>\n<h2>conn.close()<\/h2>\n<\/code><\/pre>\n<p><code>conn.commit()<\/code> \u00e7a\u011fr\u0131s\u0131, yap\u0131lan de\u011fi\u015fiklikleri kal\u0131c\u0131 olarak veritaban\u0131na kaydeder. <code>CREATE TABLE<\/code> gibi DDL (Veri Tan\u0131mlama Dili) i\u015flemleri i\u00e7in de <code>commit<\/code> \u00f6nemlidir.<\/p>\n<h3>CRUD Operasyonlar\u0131: Veri Ekleme, Okuma, G\u00fcncelleme, Silme<\/h3>\n<p>Veritaban\u0131 i\u015flemlerinin temelini olu\u015fturan CRUD (Create, Read, Update, Delete) operasyonlar\u0131, <code>sqlite3<\/code> mod\u00fcl\u00fc ile kolayca ger\u00e7ekle\u015ftirilebilir.<\/p>\n<h4>Veri Ekleme (INSERT)<\/h4>\n<p><code>INSERT INTO<\/code> komutu ile tabloya yeni kay\u0131tlar ekleyebilirsiniz. SQL enjeksiyon sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek ve veri tipleriyle ilgili sorunlar\u0131 gidermek i\u00e7in parametreli sorgular kullanmak en iyi uygulamad\u0131r.<\/p>\n<pre><code class=\"language-python\">\n<h2>Tek bir kullan\u0131c\u0131 ekleme<\/h2>\ntry:\n    cursor.execute(\"INSERT INTO kullanicilar (ad, email, yas) VALUES (?, ?, ?)\",\n                   (\"Ali Can\", \"ali.can@example.com\", 25))\n    conn.commit()\n    print(\"Ali Can ba\u015far\u0131yla eklendi.\")\nexcept sqlite3.Error as e:\n    print(f\"Veri eklenirken hata olu\u015ftu: {e}\")\n\n<h2>Birden fazla kullan\u0131c\u0131 ekleme (executemany)<\/h2>\nkullanicilar_listesi = [\n    (\"Ay\u015fe Y\u0131lmaz\", \"ayse.yilmaz@example.com\", 30),\n    (\"Mehmet Demir\", \"mehmet.demir@example.com\", 22),\n    (\"Fatma Kaya\", \"fatma.kaya@example.com\", 28)\n]\ntry:\n    cursor.executemany(\"INSERT INTO kullanicilar (ad, email, yas) VALUES (?, ?, ?)\",\n                       kullanicilar_listesi)\n    conn.commit()\n    print(\"Birden fazla kullan\u0131c\u0131 ba\u015far\u0131yla eklendi.\")\nexcept sqlite3.Error as e:\n    print(f\"Toplu veri eklenirken hata olu\u015ftu: {e}\")\n<\/code><\/pre>\n<h4>Veri Okuma (SELECT)<\/h4>\n<p><code>SELECT<\/code> komutu ile tablodaki verileri sorgulayabilirsiniz. <code>cursor<\/code> nesnesi, sorgu sonu\u00e7lar\u0131n\u0131 almak i\u00e7in \u00e7e\u015fitli metodlar sunar:<\/p>\n<ul>\n<li><code>fetchone()<\/code>: Sorgunun bir sonraki sat\u0131r\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr veya ba\u015fka sat\u0131r yoksa <code>None<\/code> d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>fetchall()<\/code>: Sorgunun t\u00fcm kalan sat\u0131rlar\u0131n\u0131 bir liste olarak d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>fetchmany(size)<\/code>: Sorgunun sonraki <code>size<\/code> kadar sat\u0131r\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li>Do\u011frudan <code>cursor<\/code> \u00fczerinde d\u00f6ng\u00fc yapmak: Her sat\u0131r\u0131 tek tek i\u015flemek i\u00e7in kullan\u0131labilir.<\/li>\n<\/ul>\n<pre><code class=\"language-python\">\n<h2>T\u00fcm kullan\u0131c\u0131lar\u0131 se\u00e7me<\/h2>\nprint(\"\\n--- T\u00fcm Kullan\u0131c\u0131lar ---\")\ncursor.execute(\"SELECT id, ad, email, yas FROM kullanicilar\")\nfor row in cursor.fetchall():\n    print(f\"ID: {row[0]}, Ad: {row[1]}, Email: {row[2]}, Ya\u015f: {row[3]}\")\n\n<h2>Belirli bir ko\u015fula g\u00f6re kullan\u0131c\u0131 se\u00e7me<\/h2>\nprint(\"\\n--- Ya\u015f\u0131 25'ten B\u00fcy\u00fck Kullan\u0131c\u0131lar ---\")\ncursor.execute(\"SELECT ad, email FROM kullanicilar WHERE yas > ?\", (25,))\nfor row in cursor.fetchall():\n    print(f\"Ad: {row[0]}, Email: {row[1]}\")\n\n<h2>Tek bir sonu\u00e7 d\u00f6nd\u00fcrme (fetchone)<\/h2>\nprint(\"\\n--- \u0130lk Kullan\u0131c\u0131 ---\")\ncursor.execute(\"SELECT ad FROM kullanicilar ORDER BY id LIMIT 1\")\nilk_kullanici = cursor.fetchone()\nif ilk_kullanici:\n    print(f\"\u0130lk kullan\u0131c\u0131 ad\u0131: {ilk_kullanici[0]}\")\n<\/code><\/pre>\n<p>Varsay\u0131lan olarak, <code>fetchone()<\/code> ve <code>fetchall()<\/code> metodlar\u0131, sat\u0131rlar\u0131 tuple olarak d\u00f6nd\u00fcr\u00fcr. S\u00fctunlara isimleriyle eri\u015fmek isterseniz, <code>conn.row_factory = sqlite3.Row<\/code> ayar\u0131n\u0131 yapabilirsiniz. Bunu &#8220;\u0130leri Seviye Konular&#8221; b\u00f6l\u00fcm\u00fcnde ele alaca\u011f\u0131z.<\/p>\n<h4>Veri G\u00fcncelleme (UPDATE)<\/h4>\n<p><code>UPDATE<\/code> komutu ile mevcut bir kayd\u0131n verilerini de\u011fi\u015ftirebilirsiniz. <code>WHERE<\/code> ko\u015fulu, hangi kay\u0131tlar\u0131n g\u00fcncellenece\u011fini belirler.<\/p>\n<pre><code class=\"language-python\">\n<h2>Bir kullan\u0131c\u0131n\u0131n ya\u015f\u0131n\u0131 g\u00fcncelleme<\/h2>\ntry:\n    cursor.execute(\"UPDATE kullanicilar SET yas = ? WHERE ad = ?\", (26, \"Ali Can\"))\n    conn.commit()\n    print(\"\\nAli Can'\u0131n ya\u015f\u0131 ba\u015far\u0131yla g\u00fcncellendi.\")\nexcept sqlite3.Error as e:\n    print(f\"Veri g\u00fcncellenirken hata olu\u015ftu: {e}\")\n\n<h2>G\u00fcncellenmi\u015f veriyi kontrol edelim<\/h2>\nprint(\"\\n--- G\u00fcncellenmi\u015f Ali Can ---\")\ncursor.execute(\"SELECT ad, yas FROM kullanicilar WHERE ad = 'Ali Can'\")\nupdated_ali = cursor.fetchone()\nif updated_ali:\n    print(f\"Ad: {updated_ali[0]}, Yeni Ya\u015f: {updated_ali[1]}\")\n<\/code><\/pre>\n<h4>Veri Silme (DELETE)<\/h4>\n<p><code>DELETE FROM<\/code> komutu ile tablodan kay\u0131tlar\u0131 silebilirsiniz. <code>WHERE<\/code> ko\u015fulu, hangi kay\u0131tlar\u0131n silinece\u011fini belirler. Ko\u015ful belirtmezseniz, tablodaki t\u00fcm kay\u0131tlar silinir!<\/p>\n<pre><code class=\"language-python\">\n<h2>Bir kullan\u0131c\u0131y\u0131 silme<\/h2>\ntry:\n    cursor.execute(\"DELETE FROM kullanicilar WHERE ad = ?\", (\"Mehmet Demir\",))\n    conn.commit()\n    print(\"\\nMehmet Demir ba\u015far\u0131yla silindi.\")\nexcept sqlite3.Error as e:\n    print(f\"Veri silinirken hata olu\u015ftu: {e}\")\n\n<h2>Silme sonras\u0131 kalan kullan\u0131c\u0131lar\u0131 kontrol edelim<\/h2>\nprint(\"\\n--- Silme Sonras\u0131 Kalan Kullan\u0131c\u0131lar ---\")\ncursor.execute(\"SELECT ad FROM kullanicilar\")\nfor row in cursor.fetchall():\n    print(f\"Kalan Kullan\u0131c\u0131: {row[0]}\")\n<\/code><\/pre>\n<h3>\u0130leri Seviye Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Daha sa\u011flam ve g\u00fcvenilir veritaban\u0131 etkile\u015fimleri i\u00e7in baz\u0131 ileri seviye konular\u0131 ve en iyi uygulamalar\u0131 bilmek \u00f6nemlidir.<\/p>\n<h4>Hata Y\u00f6netimi ve \u0130\u015flemler (Transactions)<\/h4>\n<p>Veritaban\u0131 i\u015flemleri s\u0131ras\u0131nda hatalar meydana gelebilir. Bu gibi durumlarda, veritaban\u0131n\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in i\u015flemleri geri almak (rollback) \u00f6nemlidir. Python&#8217;da <code>try...except...finally<\/code> bloklar\u0131 bu ama\u00e7la kullan\u0131labilir. <code>sqlite3<\/code> mod\u00fcl\u00fc, varsay\u0131lan olarak her <code>execute()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 bir i\u015flem (transaction) i\u00e7inde ba\u015flat\u0131r. <code>commit()<\/code> ile i\u015flem onaylan\u0131r, <code>rollback()<\/code> ile geri al\u0131n\u0131r.<\/p>\n<pre><code class=\"language-python\">\ntry:\n    # Hatal\u0131 bir sorgu \u00e7al\u0131\u015ft\u0131rmaya \u00e7al\u0131\u015fal\u0131m (\u00f6rne\u011fin, olmayan bir s\u00fctuna veri ekleme)\n    cursor.execute(\"INSERT INTO kullanicilar (ad, olmayan_sutun) VALUES (?, ?)\",\n                   (\"Deneme\", \"deger\"))\n    conn.commit()\n    print(\"Hatal\u0131 ekleme ba\u015far\u0131l\u0131 oldu (beklenmedik).\")\nexcept sqlite3.Error as e:\n    print(f\"\\nHata yakaland\u0131: {e}\")\n    conn.rollback() # Hata durumunda de\u011fi\u015fiklikleri geri al\n    print(\"De\u011fi\u015fiklikler geri al\u0131nd\u0131 (rollback).\")\nfinally:\n    # Ba\u011flant\u0131y\u0131 her zaman kapatmak i\u00e7in 'finally' blo\u011fu kullan\u0131l\u0131r.\n    # Ancak, 'with' ifadesi daha g\u00fcvenli bir y\u00f6ntemdir.\n    # conn.close() # \u015eimdilik kapatm\u0131yoruz, 'with' \u00f6rne\u011fine ge\u00e7ece\u011fiz.\n    pass\n<\/code><\/pre>\n<h4><code>with<\/code> \u0130fadesi ile Kaynak Y\u00f6netimi (Context Manager)<\/h4>\n<p><code>sqlite3<\/code> ba\u011flant\u0131 nesnesi, bir ba\u011flam y\u00f6neticisi (context manager) olarak kullan\u0131labilir. Bu, <code>with<\/code> ifadesi ile ba\u011flant\u0131y\u0131 a\u00e7\u0131p kapatmay\u0131 ve <code>commit<\/code>\/<code>rollback<\/code> i\u015flemlerini otomatik olarak y\u00f6netmeyi sa\u011flar. Bu, en \u00e7ok \u00f6nerilen yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code class=\"language-python\">\n<h2>'with' ifadesi ile ba\u011flant\u0131 y\u00f6netimi<\/h2>\ntry:\n    with sqlite3.connect('ornek_veritabani.db') as conn_with:\n        cursor_with = conn_with.cursor()\n\n        # Yeni bir tablo olu\u015ftural\u0131m\n        cursor_with.execute('''\n            CREATE TABLE IF NOT EXISTS urunler (\n                id INTEGER PRIMARY KEY AUTOINCREMENT,\n                ad TEXT NOT NULL,\n                fiyat REAL NOT NULL\n            )\n        ''')\n        print(\"\\nUrunler tablosu 'with' ile olu\u015fturuldu.\")\n\n        # Veri ekleme\n        cursor_with.execute(\"INSERT INTO urunler (ad, fiyat) VALUES (?, ?)\", (\"Laptop\", 1200.50))\n        cursor_with.execute(\"INSERT INTO urunler (ad, fiyat) VALUES (?, ?)\", (\"Mouse\", 25.00))\n        print(\"\u00dcr\u00fcnler eklendi.\")\n\n        # Bu noktada, 'with' blo\u011fundan normal \u00e7\u0131k\u0131\u015fta otomatik olarak conn_with.commit() \u00e7a\u011fr\u0131l\u0131r.\n        # E\u011fer blok i\u00e7inde bir hata olu\u015fursa, otomatik olarak conn_with.rollback() \u00e7a\u011fr\u0131l\u0131r.\n\nexcept sqlite3.Error as e:\n    print(f\"Hata olu\u015ftu: {e}. De\u011fi\u015fiklikler geri al\u0131nd\u0131.\")\n\n<h2>'with' blo\u011fu d\u0131\u015f\u0131nda ba\u011flant\u0131 otomatik olarak kapat\u0131lm\u0131\u015f olur.<\/h2>\n<h2>\u015eimdi verileri okuyabiliriz (yeni bir ba\u011flant\u0131 a\u00e7arak)<\/h2>\ntry:\n    with sqlite3.connect('ornek_veritabani.db') as conn_read:\n        cursor_read = conn_read.cursor()\n        print(\"\\n--- 'with' ile eklenen \u00dcr\u00fcnler ---\")\n        cursor_read.execute(\"SELECT ad, fiyat FROM urunler\")\n        for row in cursor_read.fetchall():\n            print(f\"\u00dcr\u00fcn: {row[0]}, Fiyat: {row[1]}\")\nexcept sqlite3.Error as e:\n    print(f\"Veri okunurken hata olu\u015ftu: {e}\")\n<\/code><\/pre>\n<h4><code>row_factory<\/code> Kullan\u0131m\u0131<\/h4>\n<p>Varsay\u0131lan olarak, <code>sqlite3<\/code> sorgu sonu\u00e7lar\u0131n\u0131 tuple olarak d\u00f6nd\u00fcr\u00fcr. S\u00fctunlara isimleriyle eri\u015fmek, kodun okunabilirli\u011fini art\u0131r\u0131r. Bunu sa\u011flamak i\u00e7in <code>conn.row_factory = sqlite3.Row<\/code> ayar\u0131n\u0131 yapabilirsiniz. <code>sqlite3.Row<\/code> nesneleri, hem indeks hem de s\u00fctun ismi ile eri\u015fimi destekleyen tuple benzeri yap\u0131lard\u0131r.<\/p>\n<pre><code class=\"language-python\">\nwith sqlite3.connect('ornek_veritabani.db') as conn_factory:\n    conn_factory.row_factory = sqlite3.Row # Bu sat\u0131r \u00e7ok \u00f6nemli!\n    cursor_factory = conn_factory.cursor()\n\n    print(\"\\n--- row_factory ile Kullan\u0131c\u0131lar ---\")\n    cursor_factory.execute(\"SELECT id, ad, email, yas FROM kullanicilar\")\n    for row in cursor_factory.fetchall():\n        print(f\"ID: {row['id']}, Ad: {row['ad']}, Email: {row['email']}, Ya\u015f: {row['yas']}\")\n        # Ayr\u0131ca indeks ile de eri\u015febilirsiniz: print(f\"Ad: {row[1]}\")\n<\/code><\/pre>\n<h4>Parametreli Sorgular\u0131n \u00d6nemi<\/h4>\n<p>Daha \u00f6nce de belirtti\u011fimiz gibi, parametreli sorgular SQL enjeksiyon sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek ve veri tiplerini otomatik olarak d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kritik \u00f6neme sahiptir. Kullan\u0131c\u0131dan gelen girdileri do\u011frudan SQL sorgusu i\u00e7ine birle\u015ftirmek yerine, her zaman <code>?<\/code> (question mark) veya <code>:param_ad\u0131<\/code> (named parameter) gibi yer tutucular kullan\u0131n.<\/p>\n<pre><code class=\"language-python\">\n<h2>G\u00fcvenli (Parametreli) Sorgu<\/h2>\nkullanici_adi = \"Deneme\"\nkullanici_yasi = 40\ncursor.execute(\"INSERT INTO kullanicilar (ad, email, yas) VALUES (?, ?, ?)\",\n               (kullanici_adi, f\"{kullanici_adi.lower()}@example.com\", kullanici_yasi))\nconn.commit()\n\n<h2>G\u00fcvenli de\u011fil (SQL Injection riski var!)<\/h2>\n<h2>kullanici_input = \"Birisi'); DROP TABLE kullanicilar; --\"<\/h2>\n<h2>cursor.execute(f\"INSERT INTO kullanicilar (ad) VALUES ('{kullanici_input}')\")<\/h2>\n<h2>ASLA B\u00d6YLE KULLANMAYIN!<\/h2>\n<\/code><\/pre>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><code>sqlite3<\/code> mod\u00fcl\u00fc, Python uygulamalar\u0131n\u0131za hafif ve g\u00fc\u00e7l\u00fc bir veritaban\u0131 yetene\u011fi eklemek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Ba\u011flant\u0131 kurma, tablo olu\u015fturma, CRUD operasyonlar\u0131 ve ileri d\u00fczey \u00f6zellikler sayesinde, bir\u00e7ok senaryoda ihtiya\u00e7lar\u0131n\u0131z\u0131 kar\u015f\u0131layabilir. <code>with<\/code> ifadesini kullanarak kaynaklar\u0131 do\u011fru y\u00f6netmek ve parametreli sorgularla g\u00fcvenli\u011fi sa\u011flamak, iyi bir uygulama geli\u015ftirmenin temelidir.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<dl>\n<dt>SQLite nedir?<\/dt>\n<dd>SQLite, sunucusuz, kendi kendine yeten, s\u0131f\u0131r yap\u0131land\u0131rmal\u0131, i\u015flemsel bir SQL veritaban\u0131 motorudur. Bir dosya olarak depolan\u0131r ve harici bir sunucuya ihtiya\u00e7 duymaz.<\/dd>\n<dt>Neden Python&#8217;da <code>sqlite3<\/code> kullanmal\u0131y\u0131m?<\/dt>\n<dd>Hafif, kurulum gerektirmeyen, Python&#8217;\u0131n standart k\u00fct\u00fcphanesinin bir par\u00e7as\u0131 olan ve k\u00fc\u00e7\u00fck\/orta \u00f6l\u00e7ekli projeler, masa\u00fcst\u00fc uygulamalar\u0131 veya testler i\u00e7in ideal bir veritaban\u0131 \u00e7\u00f6z\u00fcm\u00fcd\u00fcr.<\/dd>\n<dt>Veritaban\u0131 dosyas\u0131 nerede olu\u015fur?<\/dt>\n<dd><code>sqlite3.connect('veritabani.db')<\/code> kulland\u0131\u011f\u0131n\u0131zda, <code>veritabani.db<\/code> dosyas\u0131, Python beti\u011finizin \u00e7al\u0131\u015ft\u0131\u011f\u0131 dizinde olu\u015fur.<\/dd>\n<dt>SQL injection sald\u0131r\u0131lar\u0131ndan nas\u0131l korunurum?<\/dt>\n<dd>Her zaman parametreli sorgular kullan\u0131n. Kullan\u0131c\u0131dan gelen verileri do\u011frudan SQL sorgu dizelerine birle\u015ftirmek yerine, <code>?<\/code> veya <code>:param_ad\u0131<\/code> gibi yer tutucular kullanarak verileri ayr\u0131 bir tuple veya dictionary olarak ge\u00e7irin. <code>sqlite3<\/code> mod\u00fcl\u00fc bu verileri g\u00fcvenli bir \u015fekilde i\u015fleyecektir.<\/dd>\n<dt>Yapt\u0131\u011f\u0131m de\u011fi\u015fiklikler neden kaydedilmiyor?<\/dt>\n<dd>Veri manip\u00fclasyonu (INSERT, UPDATE, DELETE) veya tablo yap\u0131s\u0131 de\u011fi\u015fiklikleri (CREATE TABLE, ALTER TABLE) yapt\u0131ktan sonra <code>conn.commit()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yapman\u0131z gerekir. Aksi takdirde, de\u011fi\u015fiklikler bellekte kal\u0131r ve ba\u011flant\u0131 kapat\u0131ld\u0131\u011f\u0131nda kaybolur. <code>with<\/code> ifadesini kullanmak, bu i\u015flemi otomatik olarak y\u00f6netir.<\/dd>\n<dt>Ayn\u0131 anda birden fazla kullan\u0131c\u0131 bir SQLite veritaban\u0131na eri\u015febilir mi?<\/dt>\n<dd>Evet, ancak y\u00fcksek e\u015fzamanl\u0131 yazma i\u015flemleri i\u00e7in tasarlanmam\u0131\u015ft\u0131r. Birden fazla okuyucu ayn\u0131 anda eri\u015febilirken, yazma i\u015flemleri genellikle kilitlenir ve tek seferde sadece bir yazma i\u015flemi ger\u00e7ekle\u015febilir. Y\u00fcksek e\u015fzamanl\u0131l\u0131k gerektiren uygulamalar i\u00e7in PostgreSQL veya MySQL gibi sunucu tabanl\u0131 veritabanlar\u0131 daha uygundur.<\/dd>\n<dt>Bellek i\u00e7i veritaban\u0131 (<code>:memory:<\/code>) ne i\u015fe yarar?<\/dt>\n<dd><code>sqlite3.connect(':memory:')<\/code> ile olu\u015fturulan veritabanlar\u0131, sadece uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 s\u00fcre boyunca bellekte tutulur ve ba\u011flant\u0131 kapat\u0131ld\u0131\u011f\u0131nda t\u00fcm veriler kaybolur. Bu, \u00f6zellikle testler veya ge\u00e7ici veri depolama i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi\nSQLite, sunucusuz, kendi kendine yeten, s\u0131f\u0131r yap\u0131land\u0131rmal\u0131, i\u015flemsel bir SQL veritaban\u0131 m","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-36413","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python 3&#039;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python 3&#039;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Python 3&#039;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi SQLite, sunucusuz, kendi kendine yeten, s\u0131f\u0131r yap\u0131land\u0131rmal\u0131, i\u015flemsel bir SQL veritaban\u0131 m\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-15T22:41:34+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi\",\"datePublished\":\"2025-12-15T22:41:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\"},\"wordCount\":1216,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\",\"name\":\"Python 3'te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-15T22:41:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python 3'te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Python 3'te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi","og_description":"Python 3'te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi SQLite, sunucusuz, kendi kendine yeten, s\u0131f\u0131r yap\u0131land\u0131rmal\u0131, i\u015flemsel bir SQL veritaban\u0131 m","og_url":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-15T22:41:34+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi","datePublished":"2025-12-15T22:41:34+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/"},"wordCount":1216,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/","name":"Python 3'te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-15T22:41:34+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-3te-sqlite3-modulunu-kullanma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python 3&#8217;te sqlite3 Mod\u00fcl\u00fcn\u00fc Kullanma Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36413"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36413\/revisions"}],"predecessor-version":[{"id":36414,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36413\/revisions\/36414"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}