{"id":32789,"date":"2025-10-26T00:41:53","date_gmt":"2025-10-25T21:41:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32789"},"modified":"2025-10-26T00:41:53","modified_gmt":"2025-10-25T21:41:53","slug":"12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/","title":{"rendered":"12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma"},"content":{"rendered":"<p><body><\/p>\n<h2>12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma<\/h2>\n<p>DigitalOcean&#8217;\u0131n &#8220;12 Days of DigitalOcean&#8221; serisinin ikinci g\u00fcn\u00fcne ho\u015f geldiniz! Bu rehberde, DigitalOcean&#8217;da bar\u0131nd\u0131r\u0131lan bir PostgreSQL veritaban\u0131na Python kullanarak nas\u0131l ba\u011flanaca\u011f\u0131n\u0131z\u0131 ve temel veritaban\u0131 i\u015flemlerini (olu\u015fturma, okuma, g\u00fcncelleme, silme &#8211; CRUD) nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. \u0130ster yeni bir uygulama geli\u015ftiriyor olun, ister mevcut bir sistemin veritaban\u0131 entegrasyonunu sa\u011flamak isteyin, bu rehber size sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunacakt\u0131r.<\/p>\n<h3>Giri\u015f: DigitalOcean ve PostgreSQL ile Dijital Yolculu\u011fa Ba\u015flang\u0131\u00e7<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn modern uygulamalar\u0131 i\u00e7in veri y\u00f6netimi kritik bir \u00f6neme sahiptir. PostgreSQL, esnekli\u011fi, g\u00fc\u00e7l\u00fc \u00f6zellikleri ve \u00f6l\u00e7eklenebilirli\u011fi ile geli\u015ftiriciler aras\u0131nda pop\u00fcler bir a\u00e7\u0131k kaynak ili\u015fkisel veritaban\u0131 y\u00f6netim sistemidir. DigitalOcean ise, y\u00f6netilen veritaban\u0131 hizmetleri (Managed Databases) sayesinde PostgreSQL kurulumu, bak\u0131m\u0131 ve \u00f6l\u00e7eklendirilmesi gibi karma\u015f\u0131k g\u00f6revleri sizin i\u00e7in basitle\u015ftirir. Bu sayede siz, uygulaman\u0131z\u0131n mant\u0131\u011f\u0131na odaklanabilirsiniz.<\/p>\n<p>Python, geni\u015f k\u00fct\u00fcphane ekosistemi ve okunabilir s\u00f6zdizimi sayesinde veritaban\u0131 etkile\u015fimleri i\u00e7in m\u00fckemmel bir se\u00e7imdir. Bu rehberde, Python&#8217;\u0131n <code>psycopg2<\/code> k\u00fct\u00fcphanesini kullanarak DigitalOcean PostgreSQL veritaban\u0131n\u0131zla nas\u0131l ileti\u015fim kuraca\u011f\u0131n\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu rehberin sonunda \u015funlar\u0131 yapabiliyor olacaks\u0131n\u0131z:<\/p>\n<p>*   DigitalOcean PostgreSQL ba\u011flant\u0131 bilgilerini anlama.<br \/>\n*   Python ortam\u0131n\u0131z\u0131 <code>psycopg2<\/code> k\u00fct\u00fcphanesi ile haz\u0131rlama.<br \/>\n*   Python kodunuzdan PostgreSQL veritaban\u0131na g\u00fcvenli bir \u015fekilde ba\u011flanma.<br \/>\n*   Temel CRUD (Create, Read, Update, Delete) i\u015flemlerini ger\u00e7ekle\u015ftirme.<br \/>\n*   Veritaban\u0131 etkile\u015fimlerinde en iyi uygulamalar\u0131 ve g\u00fcvenlik ipu\u00e7lar\u0131n\u0131 \u00f6\u011frenme.<\/p>\n<p>Haz\u0131rsan\u0131z, DigitalOcean&#8217;daki PostgreSQL veritaban\u0131n\u0131zla Python&#8217;\u0131 konu\u015fturmaya ba\u015flayal\u0131m!<\/p>\n<h3>Ad\u0131m 1: DigitalOcean PostgreSQL Veritaban\u0131 Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Bu rehbere ba\u015flamadan \u00f6nce DigitalOcean hesab\u0131n\u0131zda bir PostgreSQL y\u00f6netilen veritaban\u0131n\u0131z\u0131n oldu\u011funu varsay\u0131yoruz. E\u011fer hen\u00fcz bir veritaban\u0131 olu\u015fturmad\u0131ysan\u0131z, DigitalOcean kontrol panelinden birka\u00e7 t\u0131klamayla kolayca yeni bir PostgreSQL veritaban\u0131 olu\u015fturabilirsiniz.<\/p>\n<p>Veritaban\u0131n\u0131z\u0131 olu\u015fturduktan sonra, Python uygulaman\u0131z\u0131n ba\u011flanabilmesi i\u00e7in gerekli olan ba\u011flant\u0131 bilgilerini edinmeniz gerekmektedir. Bu bilgiler genellikle DigitalOcean kontrol panelinizdeki veritaban\u0131n\u0131z\u0131n genel bak\u0131\u015f sayfas\u0131nda &#8220;Connection Details&#8221; veya &#8220;Ba\u011flant\u0131 Detaylar\u0131&#8221; b\u00f6l\u00fcm\u00fcnde bulunur. \u0130htiyac\u0131m\u0131z olan temel bilgiler \u015funlard\u0131r:<\/p>\n<p>*   <strong>Hostname (Ana Bilgisayar Ad\u0131):<\/strong> Veritaban\u0131n\u0131z\u0131n IP adresi veya ana bilgisayar ad\u0131.<br \/>\n*   <strong>Port (Ba\u011flant\u0131 Noktas\u0131):<\/strong> Genellikle PostgreSQL i\u00e7in 25060&#8217;t\u0131r.<br \/>\n*   <strong>Database (Veritaban\u0131 Ad\u0131):<\/strong> Ba\u011flanmak istedi\u011finiz veritaban\u0131n\u0131n ad\u0131 (varsay\u0131lan genellikle <code>defaultdb<\/code> veya sizin belirledi\u011finiz bir isimdir).<br \/>\n*   <strong>Username (Kullan\u0131c\u0131 Ad\u0131):<\/strong> Veritaban\u0131na ba\u011flanmak i\u00e7in kullan\u0131lacak kullan\u0131c\u0131 ad\u0131.<br \/>\n*   <strong>Password (\u015eifre):<\/strong> Belirlenen kullan\u0131c\u0131n\u0131n \u015fifresi.<br \/>\n*   <strong>SSL Mode:<\/strong> DigitalOcean y\u00f6netilen veritabanlar\u0131 i\u00e7in genellikle <code>require<\/code> olarak ayarlanm\u0131\u015ft\u0131r, bu da g\u00fcvenli bir ba\u011flant\u0131 sa\u011flar.<\/p>\n<p>Bu bilgileri bir yere not edin veya daha iyisi, bir sonraki ad\u0131mda g\u00f6sterece\u011fimiz gibi ortam de\u011fi\u015fkenleri olarak ayarlamaya haz\u0131r olun. Unutmay\u0131n, bu bilgiler hassas oldu\u011fundan, kodunuzun i\u00e7ine do\u011frudan yazmaktan ka\u00e7\u0131nmal\u0131y\u0131z.<\/p>\n<h3>Ad\u0131m 2: Python Ortam\u0131n\u0131 Kurma ve Gerekli K\u00fct\u00fcphaneleri Y\u00fckleme<\/h3>\n<p>PostgreSQL veritaban\u0131 ile Python aras\u0131nda ileti\u015fim kurmak i\u00e7in <code>psycopg2<\/code> adl\u0131 pop\u00fcler bir adapt\u00f6r k\u00fct\u00fcphanesini kullanaca\u011f\u0131z. Bu k\u00fct\u00fcphane, Python&#8217;dan PostgreSQL&#8217;e SQL sorgular\u0131 g\u00f6ndermenize ve sonu\u00e7lar\u0131 alman\u0131za olanak tan\u0131r.<\/p>\n<h4>2.1. Sanal Ortam Olu\u015fturma<\/h4>\n<p>Python projeleriniz i\u00e7in her zaman sanal ortam (virtual environment) kullanman\u0131z \u015fiddetle tavsiye edilir. Bu, projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 sisteminizdeki di\u011fer Python projelerinden izole etmenizi sa\u011flar.<\/p>\n<p>Terminalinizi a\u00e7\u0131n ve projeniz i\u00e7in bir dizin olu\u015fturun, ard\u0131ndan bu dizine gidin:<\/p>\n<pre><code class=\"language-bash\">mkdir digitalocean_pg_python\ncd digitalocean_pg_python<\/code><\/pre>\n<p>\u015eimdi bir sanal ortam olu\u015ftural\u0131m ve onu etkinle\u015ftirelim:<\/p>\n<pre><code class=\"language-bash\">python3 -m venv venv<\/code><\/pre>\n<p>*   <strong>Linux\/macOS:<\/strong><\/p>\n<pre><code class=\"language-bash\">source venv\/bin\/activate<\/code><\/pre>\n<p>*   <strong>Windows:<\/strong><\/p>\n<pre><code class=\"language-bash\">.\\venv\\Scripts\\activate<\/code><\/pre>\n<p>Sanal ortam\u0131n\u0131z etkinle\u015ftirildi\u011finde, terminal istemcinizin ba\u015f\u0131nda <code>(venv)<\/code> gibi bir ifade g\u00f6receksiniz.<\/p>\n<h4>2.2. <code>psycopg2<\/code> K\u00fct\u00fcphanesini Y\u00fckleme<\/h4>\n<p>Sanal ortam\u0131n\u0131z etkin durumdayken, <code>psycopg2-binary<\/code> paketini y\u00fckleyelim. <code>psycopg2-binary<\/code>, \u00f6nceden derlenmi\u015f bir s\u00fcr\u00fcm oldu\u011fu i\u00e7in kurulumu daha kolayd\u0131r ve \u00e7o\u011fu kullan\u0131m durumu i\u00e7in yeterlidir.<\/p>\n<pre><code class=\"language-bash\">pip install psycopg2-binary python-dotenv<\/code><\/pre>\n<p>Burada <code>python-dotenv<\/code> paketini de y\u00fckl\u00fcyoruz. Bu paket, hassas veritaban\u0131 ba\u011flant\u0131 bilgilerimizi <code>.env<\/code> dosyas\u0131ndan okuyarak g\u00fcvenli\u011fi art\u0131rmam\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Ad\u0131m 3: Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma ve Temel \u0130\u015flemler<\/h3>\n<p>\u015eimdi Python kodumuzu yazmaya ba\u015flayabiliriz. \u0130lk olarak, veritaban\u0131 ba\u011flant\u0131 bilgilerimizi g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in bir <code>.env<\/code> dosyas\u0131 olu\u015ftural\u0131m.<\/p>\n<h4>3.1. <code>.env<\/code> Dosyas\u0131 Olu\u015fturma<\/h4>\n<p><code>digitalocean_pg_python<\/code> dizininizde <code>config.py<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine DigitalOcean kontrol panelinizden ald\u0131\u011f\u0131n\u0131z ba\u011flant\u0131 bilgilerini ekleyin:<\/p>\n<pre><code class=\"language-\"># .env dosyas\u0131\nDB_HOST=your_digitalocean_db_host\nDB_NAME=defaultdb\nDB_USER=doadmin\nDB_PASSWORD=your_db_password\nDB_PORT=25060<\/code><\/pre>\n<p><code>your_digitalocean_db_host<\/code>, <code>your_db_password<\/code> gibi yerleri kendi ger\u00e7ek bilgilerinizle de\u011fi\u015ftirmeyi unutmay\u0131n. Bu dosyan\u0131n <code>.gitignore<\/code> dosyan\u0131za eklenerek versiyon kontrol sistemlerine y\u00fcklenmemesi gerekti\u011fini unutmay\u0131n!<\/p>\n<h4>3.2. Python Kodu ile Ba\u011flant\u0131 ve CRUD \u0130\u015flemleri<\/h4>\n<p>\u015eimdi <code>app.py<\/code> ad\u0131nda yeni bir Python dosyas\u0131 olu\u015ftural\u0131m ve i\u00e7ine a\u015fa\u011f\u0131daki kodu yap\u0131\u015ft\u0131ral\u0131m:<\/p>\n<pre><code class=\"language-python\">import psycopg2\nimport os\nfrom dotenv import load_dotenv\n\n<h2>.env dosyas\u0131ndaki de\u011fi\u015fkenleri y\u00fckle<\/h2>\nload_dotenv()\n\n<h2>Ortam de\u011fi\u015fkenlerinden ba\u011flant\u0131 bilgilerini al<\/h2>\nDB_HOST = os.getenv(\"DB_HOST\")\nDB_NAME = os.getenv(\"DB_NAME\")\nDB_USER = os.getenv(\"DB_USER\")\nDB_PASSWORD = os.getenv(\"DB_PASSWORD\")\nDB_PORT = os.getenv(\"DB_PORT\")\n\n<h2>Veritaban\u0131 ba\u011flant\u0131 nesnesi<\/h2>\nconn = None\ncur = None\n\ntry:\n    # 1. Veritaban\u0131na Ba\u011flanma\n    print(\"Veritaban\u0131na ba\u011flan\u0131l\u0131yor...\")\n    conn = psycopg2.connect(\n        host=DB_HOST,\n        database=DB_NAME,\n        user=DB_USER,\n        password=DB_PASSWORD,\n        port=DB_PORT,\n        sslmode='require' # DigitalOcean i\u00e7in genellikle 'require'\n    )\n    cur = conn.cursor()\n    print(\"Veritaban\u0131na ba\u015far\u0131yla ba\u011flan\u0131ld\u0131!\")\n\n    # 2. CRUD \u0130\u015flemleri\n\n    # 2.1. CREATE (Tablo Olu\u015fturma)\n    print(\"\\n'kullanicilar' tablosu olu\u015fturuluyor (varsa atlanacak)...\")\n    cur.execute(\"\"\"\n        CREATE TABLE IF NOT EXISTS kullanicilar (\n            id SERIAL PRIMARY KEY,\n            ad VARCHAR(100) NOT NULL,\n            email VARCHAR(100) UNIQUE NOT NULL,\n            kayit_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n        )\n    \"\"\")\n    conn.commit() # De\u011fi\u015fiklikleri veritaban\u0131na kaydet\n    print(\"Kullanicilar tablosu olu\u015fturuldu veya zaten mevcut.\")\n\n    # 2.2. INSERT (Veri Ekleme)\n    print(\"\\nYeni kullan\u0131c\u0131lar ekleniyor...\")\n    try:\n        cur.execute(\"INSERT INTO kullanicilar (ad, email) VALUES (%s, %s)\", (\"Ahmet Y\u0131lmaz\", \"ahmet@example.com\"))\n        cur.execute(\"INSERT INTO kullanicilar (ad, email) VALUES (%s, %s)\", (\"Ay\u015fe Demir\", \"ayse@example.com\"))\n        conn.commit()\n        print(\"Kullan\u0131c\u0131lar ba\u015far\u0131yla eklendi.\")\n    except psycopg2.errors.UniqueViolation:\n        conn.rollback() # Hata durumunda i\u015flemi geri al\n        print(\"Baz\u0131 kullan\u0131c\u0131lar zaten mevcut oldu\u011fu i\u00e7in eklenemedi (UniqueViolation).\")\n    except Exception as e:\n        conn.rollback()\n        print(f\"Kullan\u0131c\u0131 eklenirken bir hata olu\u015ftu: {e}\")\n\n    # 2.3. SELECT (Veri Okuma)\n    print(\"\\nT\u00fcm kullan\u0131c\u0131lar listeleniyor:\")\n    cur.execute(\"SELECT id, ad, email, kayit_tarihi FROM kullanicilar ORDER BY id ASC\")\n    rows = cur.fetchall() # T\u00fcm sonu\u00e7lar\u0131 al\n    if rows:\n        for row in rows:\n            print(f\"ID: {row[0]}, Ad: {row[1]}, Email: {row[2]}, Kay\u0131t Tarihi: {row[3]}\")\n    else:\n        print(\"Hen\u00fcz hi\u00e7 kullan\u0131c\u0131 yok.\")\n\n    # Belirli bir kullan\u0131c\u0131y\u0131 se\u00e7me\n    print(\"\\nBelirli bir kullan\u0131c\u0131 aran\u0131yor (email: ahmet@example.com):\")\n    cur.execute(\"SELECT id, ad, email FROM kullanicilar WHERE email = %s\", (\"ahmet@example.com\",))\n    ahmet = cur.fetchone() # Tek bir sonu\u00e7 al\n    if ahmet:\n        print(f\"Bulunan Kullan\u0131c\u0131: ID: {ahmet[0]}, Ad: {ahmet[1]}, Email: {ahmet[2]}\")\n    else:\n        print(\"Ahmet Y\u0131lmaz bulunamad\u0131.\")\n\n    # 2.4. UPDATE (Veri G\u00fcncelleme)\n    print(\"\\nBir kullan\u0131c\u0131n\u0131n ad\u0131 g\u00fcncelleniyor (email: ahmet@example.com)...\")\n    cur.execute(\"UPDATE kullanicilar SET ad = %s WHERE email = %s\", (\"Ahmet Can Y\u0131lmaz\", \"ahmet@example.com\"))\n    conn.commit()\n    print(\"Kullan\u0131c\u0131 ba\u015far\u0131yla g\u00fcncellendi.\")\n\n    # G\u00fcncellenmi\u015f veriyi tekrar sorgula\n    print(\"\\nG\u00fcncelleme sonras\u0131 kullan\u0131c\u0131 listesi:\")\n    cur.execute(\"SELECT id, ad, email FROM kullanicilar WHERE email = %s\", (\"ahmet@example.com\",))\n    updated_ahmet = cur.fetchone()\n    if updated_ahmet:\n        print(f\"G\u00fcncellenen Kullan\u0131c\u0131: ID: {updated_ahmet[0]}, Ad: {updated_ahmet[1]}, Email: {updated_ahmet[2]}\")\n\n    # 2.5. DELETE (Veri Silme)\n    print(\"\\nBir kullan\u0131c\u0131 siliniyor (email: ayse@example.com)...\")\n    cur.execute(\"DELETE FROM kullanicilar WHERE email = %s\", (\"ayse@example.com\",))\n    conn.commit()\n    print(\"Kullan\u0131c\u0131 ba\u015far\u0131yla silindi.\")\n\n    # Silme sonras\u0131 kontrol\n    print(\"\\nSilme sonras\u0131 t\u00fcm kullan\u0131c\u0131lar listeleniyor:\")\n    cur.execute(\"SELECT id, ad, email FROM kullanicilar ORDER BY id ASC\")\n    rows_after_delete = cur.fetchall()\n    if rows_after_delete:\n        for row in rows_after_delete:\n            print(f\"ID: {row[0]}, Ad: {row[1]}, Email: {row[2]}\")\n    else:\n        print(\"Silme sonras\u0131 hi\u00e7 kullan\u0131c\u0131 kalmad\u0131.\")\n\nexcept psycopg2.Error as e:\n    print(f\"Veritaban\u0131 hatas\u0131 olu\u015ftu: {e}\")\n    # Hata durumunda bekleyen t\u00fcm i\u015flemleri geri al\n    if conn:\n        conn.rollback()\nexcept Exception as e:\n    print(f\"Genel bir hata olu\u015ftu: {e}\")\nfinally:\n    # Ba\u011flant\u0131y\u0131 ve imleci kapat\n    if cur:\n        cur.close()\n    if conn:\n        conn.close()\n    print(\"\\nVeritaban\u0131 ba\u011flant\u0131s\u0131 kapat\u0131ld\u0131.\")<\/code><\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, terminalinizde veritaban\u0131na ba\u011flan\u0131ld\u0131\u011f\u0131n\u0131, tablo olu\u015fturuldu\u011funu, verilerin eklendi\u011fini, g\u00fcncellendi\u011fini ve silindi\u011fini g\u00f6steren \u00e7\u0131kt\u0131lar\u0131 g\u00f6receksiniz.<\/p>\n<h4>Kod A\u00e7\u0131klamalar\u0131:<\/h4>\n<p>*   <strong><code>load_dotenv()<\/code>:<\/strong> <code>.env<\/code> dosyas\u0131ndaki ortam de\u011fi\u015fkenlerini Python ortam\u0131na y\u00fckler.<br \/>\n*   <strong><code>os.getenv()<\/code>:<\/strong> Ortam de\u011fi\u015fkenlerinden ba\u011flant\u0131 bilgilerini g\u00fcvenli bir \u015fekilde al\u0131r. Bu, hassas bilgilerin kodunuzda sabit kodlanmas\u0131n\u0131 engeller.<br \/>\n*   <strong><code>psycopg2.connect()<\/code>:<\/strong> Veritaban\u0131na bir ba\u011flant\u0131 kurar. <code>sslmode='require'<\/code> DigitalOcean&#8217;da g\u00fcvenli ba\u011flant\u0131 i\u00e7in \u00f6nemlidir.<br \/>\n*   <strong><code>conn.cursor()<\/code>:<\/strong> Veritaban\u0131nda SQL komutlar\u0131n\u0131 y\u00fcr\u00fctmek i\u00e7in bir imle\u00e7 (cursor) nesnesi olu\u015fturur. T\u00fcm sorgular bu imle\u00e7 \u00fczerinden yap\u0131l\u0131r.<br \/>\n*   <strong><code>cur.execute(sql_query, (parameters,))<\/code>:<\/strong> SQL sorgusunu y\u00fcr\u00fct\u00fcr. Parametreleri do\u011frudan sorgu dizesine kat\u0131\u015ft\u0131rmak yerine <code>%s<\/code> kullanarak ve bir tuple i\u00e7inde ge\u00e7irmek, SQL enjeksiyon sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n*   <strong><code>conn.commit()<\/code>:<\/strong> <code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code> gibi veri de\u011fi\u015ftiren i\u015flemlerden sonra de\u011fi\u015fiklikleri veritaban\u0131na kal\u0131c\u0131 olarak kaydeder. Bir i\u015flem (transaction) ba\u015flat\u0131r ve bitirir.<br \/>\n*   <strong><code>conn.rollback()<\/code>:<\/strong> Bir hata olu\u015ftu\u011funda veya i\u015flemi iptal etmek istedi\u011finizde, <code>commit()<\/code> yap\u0131lmadan \u00f6nceki t\u00fcm de\u011fi\u015fiklikleri geri al\u0131r.<br \/>\n*   <strong><code>cur.fetchall()<\/code>:<\/strong> <code>SELECT<\/code> sorgusundan d\u00f6nen t\u00fcm sonu\u00e7lar\u0131 bir liste olarak al\u0131r. Her sat\u0131r bir tuple&#8217;d\u0131r.<br \/>\n*   <strong><code>cur.fetchone()<\/code>:<\/strong> <code>SELECT<\/code> sorgusundan d\u00f6nen ilk sonucu bir tuple olarak al\u0131r.<br \/>\n*   <strong><code>try...except...finally<\/code>:<\/strong> Hata y\u00f6netimi i\u00e7in kullan\u0131l\u0131r. <code>finally<\/code> blo\u011fu, bir hata olsa bile ba\u011flant\u0131n\u0131n ve imlecin d\u00fczg\u00fcn bir \u015fekilde kapat\u0131lmas\u0131n\u0131 sa\u011flar. Bu, kaynak s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<br \/>\n*   <strong><code>psycopg2.errors.UniqueViolation<\/code>:<\/strong> PostgreSQL&#8217;den d\u00f6nen belirli bir hata t\u00fcr\u00fcn\u00fc (\u00f6rne\u011fin, benzersiz bir s\u00fctuna zaten var olan bir de\u011fer eklemeye \u00e7al\u0131\u015fma) yakalamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>En \u0130yi Uygulamalar ve G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h3>\n<p>Veritaban\u0131 etkile\u015fimleri yaparken baz\u0131 en iyi uygulamalar\u0131 ve g\u00fcvenlik ipu\u00e7lar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak, uygulaman\u0131z\u0131n daha sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>H3.1. Ortam De\u011fi\u015fkenlerini Kullan\u0131n<\/h4>\n<p>Veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131 gibi hassas bilgileri asla do\u011frudan kodunuzun i\u00e7ine yazmay\u0131n. Bunun yerine, <code>.env<\/code> dosyalar\u0131 veya sunucunuzun ortam de\u011fi\u015fkenleri gibi y\u00f6ntemler kullanarak bu bilgileri d\u0131\u015far\u0131da tutun. <code>python-dotenv<\/code> k\u00fct\u00fcphanesi bu konuda b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Bu sayede kodunuzu GitHub gibi platformlarda payla\u015f\u0131rken hassas bilgilerin a\u00e7\u0131\u011fa \u00e7\u0131kmas\u0131n\u0131 engellersiniz.<\/p>\n<h4>H3.2. SQL Enjeksiyonuna Kar\u015f\u0131 Koruma<\/h4>\n<p><code>psycopg2<\/code> k\u00fct\u00fcphanesini kullan\u0131rken SQL sorgular\u0131na de\u011fi\u015fken de\u011ferleri eklemek i\u00e7in parametreli sorgular\u0131 (<code>%s<\/code> ve bir tuple kullanma) kullan\u0131n. Asla Python f-string&#8217;leri veya string birle\u015ftirme ile do\u011frudan kullan\u0131c\u0131 girdisini SQL sorgusuna kat\u0131\u015ft\u0131rmay\u0131n. <code>cur.execute(\"SELECT <em> FROM users WHERE username = '%s'\" % user_input)<\/code> gibi kullan\u0131mlar SQL enjeksiyonuna a\u00e7\u0131kt\u0131r. Do\u011fru kullan\u0131m <code>cur.execute(\"SELECT <\/em> FROM users WHERE username = %s\", (user_input,))<\/code> \u015feklindedir.<\/p>\n<h4>H3.3. Ba\u011flant\u0131 Havuzu (Connection Pooling) Kullan\u0131m\u0131<\/h4>\n<p>\u00d6zellikle web uygulamalar\u0131 gibi birden fazla e\u015fzamanl\u0131 iste\u011fin oldu\u011fu durumlarda, her istek i\u00e7in yeni bir veritaban\u0131 ba\u011flant\u0131s\u0131 a\u00e7mak ve kapatmak performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir. Ba\u011flant\u0131 havuzu (connection pooling), \u00f6nceden a\u00e7\u0131lm\u0131\u015f ba\u011flant\u0131lar\u0131 yeniden kullanarak bu y\u00fck\u00fc azalt\u0131r. <code>psycopg2<\/code>&#8216;nin kendi ba\u011flant\u0131 havuzu mod\u00fclleri (<code>psycopg2.pool<\/code>) veya <code>SQLAlchemy<\/code> gibi ORM&#8217;ler bu \u00f6zelli\u011fi sunar. K\u00fc\u00e7\u00fck betikler i\u00e7in gerekli olmasa da, daha b\u00fcy\u00fck projelerde d\u00fc\u015f\u00fcn\u00fclmesi gereken bir optimizasyondur.<\/p>\n<h4>H3.4. \u0130\u015flem Y\u00f6netimi (Transaction Management)<\/h4>\n<p>Veritaban\u0131 i\u015flemlerini her zaman <code>conn.commit()<\/code> ve <code>conn.rollback()<\/code> ile y\u00f6netin. Bir dizi veritaban\u0131 de\u011fi\u015fikli\u011finin atomik (ya hepsi ger\u00e7ekle\u015fir ya da hi\u00e7biri) olmas\u0131n\u0131 sa\u011flamak i\u00e7in t\u00fcm de\u011fi\u015fiklikleri tek bir <code>try...except<\/code> blo\u011fu i\u00e7inde toplay\u0131n ve yaln\u0131zca t\u00fcm i\u015flemler ba\u015far\u0131l\u0131 olursa <code>commit()<\/code> yap\u0131n. Herhangi bir hata durumunda <code>rollback()<\/code> yaparak veritaban\u0131n\u0131 tutarl\u0131 bir duruma geri getirin.<\/p>\n<h4>H3.5. Ba\u011flant\u0131lar\u0131 Kapatmay\u0131 Unutmay\u0131n<\/h4>\n<p><code>try...except...finally<\/code> blo\u011funu kullanarak veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n ve imle\u00e7lerinin her zaman kapat\u0131ld\u0131\u011f\u0131ndan emin olun (<code>cur.close()<\/code>, <code>conn.close()<\/code>). Bu, veritaban\u0131 kaynaklar\u0131n\u0131n gereksiz yere me\u015fgul edilmesini \u00f6nler ve uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Bu rehberde, DigitalOcean&#8217;daki PostgreSQL veritaban\u0131n\u0131za Python kullanarak nas\u0131l ba\u011flanaca\u011f\u0131n\u0131z\u0131 ve temel CRUD i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi \u00f6\u011frendiniz. <code>psycopg2<\/code> k\u00fct\u00fcphanesini kullanarak g\u00fcvenli ve etkili bir \u015fekilde veritaban\u0131 etkile\u015fimleri kurabilir, uygulamalar\u0131n\u0131z i\u00e7in g\u00fc\u00e7l\u00fc bir veri katman\u0131 olu\u015fturabilirsiniz. Unutmay\u0131n, pratik yapmak ve \u00f6\u011frendiklerinizi kendi projelerinizde uygulamak, bu bilgileri peki\u015ftirmenin en iyi yoludur.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<p><strong>S1: <code>psycopg2<\/code> ve <code>psycopg2-binary<\/code> aras\u0131ndaki fark nedir?<\/strong><br \/>\n<strong>C1:<\/strong> <code>psycopg2-binary<\/code>, \u00f6nceden derlenmi\u015f bir pakettir ve \u00e7o\u011fu i\u015fletim sistemi i\u00e7in kolayca <code>pip install<\/code> ile kurulabilir. <code>psycopg2<\/code> ise, y\u00fckleme s\u0131ras\u0131nda yerel C derleyicisine (\u00f6rne\u011fin, <code>pg_config<\/code> ve PostgreSQL geli\u015ftirme ba\u015fl\u0131klar\u0131na) ihtiya\u00e7 duyar. \u00c7o\u011fu geli\u015ftirici i\u00e7in <code>psycopg2-binary<\/code> daha kolay bir se\u00e7enektir, ancak \u00f6zel derleme gerektiren veya daha fazla kontrol isteyen durumlar i\u00e7in <code>psycopg2<\/code> tercih edilebilir.<\/p>\n<p><strong>S2: Ba\u011flant\u0131 neden kapanm\u0131yor gibi g\u00f6r\u00fcn\u00fcyor veya &#8220;too many connections&#8221; hatas\u0131 al\u0131yorum?<\/strong><br \/>\n<strong>C2:<\/strong> Bu genellikle ba\u011flant\u0131lar\u0131 d\u00fczg\u00fcn bir \u015fekilde kapatmad\u0131\u011f\u0131n\u0131z anlam\u0131na gelir. <code>try...except...finally<\/code> blo\u011funun <code>finally<\/code> k\u0131sm\u0131nda <code>cur.close()<\/code> ve <code>conn.close()<\/code> \u00e7a\u011fr\u0131lar\u0131n\u0131 yapt\u0131\u011f\u0131n\u0131zdan emin olun. Ayr\u0131ca, yo\u011fun uygulamalarda ba\u011flant\u0131 havuzu (connection pooling) kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p><strong>S3: DigitalOcean&#8217;da veritaban\u0131 \u015fifremi unuttum, ne yapmal\u0131y\u0131m?<\/strong><br \/>\n<strong>C3:<\/strong> DigitalOcean kontrol panelinizden veritaban\u0131n\u0131z\u0131n ayarlar\u0131na giderek \u015fifrenizi s\u0131f\u0131rlayabilirsiniz. &#8220;Users &#038; Databases&#8221; veya &#8220;Kullan\u0131c\u0131lar ve Veritabanlar\u0131&#8221; b\u00f6l\u00fcm\u00fcnde, ilgili kullan\u0131c\u0131n\u0131n \u015fifresini s\u0131f\u0131rlama se\u00e7ene\u011fini bulacaks\u0131n\u0131z.<\/p>\n<p><strong>S4: <code>OperationalError<\/code> al\u0131yorum, bu ne anlama geliyor?<\/strong><br \/>\n<strong>C4:<\/strong> <code>OperationalError<\/code> genellikle ba\u011flant\u0131 sorunlar\u0131n\u0131 g\u00f6sterir. \u015eunlar\u0131 kontrol edin:<br \/>\n*   Ba\u011flant\u0131 bilgileriniz (<code>host<\/code>, <code>port<\/code>, <code>database<\/code>, <code>user<\/code>, <code>password<\/code>) do\u011fru mu?<br \/>\n*   DigitalOcean veritaban\u0131n\u0131z \u00e7al\u0131\u015f\u0131r durumda m\u0131?<br \/>\n*   Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 sunucudan DigitalOcean veritaban\u0131na a\u011f eri\u015fimi var m\u0131 (g\u00fcvenlik duvar\u0131 kurallar\u0131)?<br \/>\n*   <code>sslmode='require'<\/code> ayar\u0131 do\u011fru mu?<\/p>\n<p><strong>S5: Birden fazla tablom var, ayn\u0131 veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kullanabilir miyim?<\/strong><br \/>\n<strong>C5:<\/strong> Evet, bir veritaban\u0131 ba\u011flant\u0131s\u0131 (connection) \u00fczerinden birden fazla imle\u00e7 (cursor) olu\u015fturabilir ve farkl\u0131 tablolar \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftirebilirsiniz. Ba\u011flant\u0131, t\u00fcm veritaban\u0131na eri\u015fimi sa\u011flar; imle\u00e7 ise SQL sorgular\u0131n\u0131 y\u00fcr\u00fctmek i\u00e7in bir arac\u0131d\u0131r.<\/p>\n<p>Bu rehberin DigitalOcean ve Python ile PostgreSQL yolculu\u011funuzda size yard\u0131mc\u0131 oldu\u011funu umuyoruz. Ba\u015far\u0131lar dileriz!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma\nDigitalOcean&#8217;\u0131n &#8220;12 Days of DigitalOcean&#8221; serisinin ikinci g\u00fcn\u00fcn","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":[644],"tags":[],"class_list":{"0":"post-32789","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-postgresql","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>12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma - 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\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma\" \/>\n<meta property=\"og:description\" content=\"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma DigitalOcean&#039;\u0131n &quot;12 Days of DigitalOcean&quot; serisinin ikinci g\u00fcn\u00fcn\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-25T21:41:53+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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma\",\"datePublished\":\"2025-10-25T21:41:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\"},\"wordCount\":1933,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\",\"name\":\"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-25T21:41:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma\"}]},{\"@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":"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma - 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\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/","og_locale":"tr_TR","og_type":"article","og_title":"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma","og_description":"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma DigitalOcean'\u0131n \"12 Days of DigitalOcean\" serisinin ikinci g\u00fcn\u00fcn","og_url":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-25T21:41:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma","datePublished":"2025-10-25T21:41:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/"},"wordCount":1933,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PostgreSQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/","url":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/","name":"12 Days of DigitalOcean (Day 2) - Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-25T21:41:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/12-days-of-digitalocean-day-2-python-ile-postgresql-veritabanina-baglanma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"12 Days of DigitalOcean (Day 2) &#8211; Python ile PostgreSQL Veritaban\u0131na Ba\u011flanma"}]},{"@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\/32789","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=32789"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32789\/revisions"}],"predecessor-version":[{"id":32790,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32789\/revisions\/32790"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}