Takip et

12 Days of DigitalOcean (Day 2) – Python ile PostgreSQL Veritabanına Bağlanma

12 Days of DigitalOcean (Day 2) – Python ile PostgreSQL Veritabanına Bağlanma DigitalOcean’ın “12 Days of DigitalOcean” serisinin ikinci günün

12 Days of DigitalOcean (Day 2) – Python ile PostgreSQL Veritabanına Bağlanma

DigitalOcean’ın “12 Days of DigitalOcean” serisinin ikinci gününe hoş geldiniz! Bu rehberde, DigitalOcean’da barındırılan bir PostgreSQL veritabanına Python kullanarak nasıl bağlanacağınızı ve temel veritabanı işlemlerini (oluşturma, okuma, güncelleme, silme – CRUD) nasıl gerçekleştireceğinizi adım adım öğreneceğiz. İster yeni bir uygulama geliştiriyor olun, ister mevcut bir sistemin veritabanı entegrasyonunu sağlamak isteyin, bu rehber size sağlam bir başlangıç noktası sunacaktır.

Giriş: DigitalOcean ve PostgreSQL ile Dijital Yolculuğa Başlangıç

Günümüzün modern uygulamaları için veri yönetimi kritik bir öneme sahiptir. PostgreSQL, esnekliği, güçlü özellikleri ve ölçeklenebilirliği ile geliştiriciler arasında popüler bir açık kaynak ilişkisel veritabanı yönetim sistemidir. DigitalOcean ise, yönetilen veritabanı hizmetleri (Managed Databases) sayesinde PostgreSQL kurulumu, bakımı ve ölçeklendirilmesi gibi karmaşık görevleri sizin için basitleştirir. Bu sayede siz, uygulamanızın mantığına odaklanabilirsiniz.

Python, geniş kütüphane ekosistemi ve okunabilir sözdizimi sayesinde veritabanı etkileşimleri için mükemmel bir seçimdir. Bu rehberde, Python’ın psycopg2 kütüphanesini kullanarak DigitalOcean PostgreSQL veritabanınızla nasıl iletişim kuracağınızı detaylı bir şekilde inceleyeceğiz. Bu rehberin sonunda şunları yapabiliyor olacaksınız:

* DigitalOcean PostgreSQL bağlantı bilgilerini anlama.
* Python ortamınızı psycopg2 kütüphanesi ile hazırlama.
* Python kodunuzdan PostgreSQL veritabanına güvenli bir şekilde bağlanma.
* Temel CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirme.
* Veritabanı etkileşimlerinde en iyi uygulamaları ve güvenlik ipuçlarını öğrenme.

Hazırsanız, DigitalOcean’daki PostgreSQL veritabanınızla Python’ı konuşturmaya başlayalım!

Adım 1: DigitalOcean PostgreSQL Veritabanı Hazırlığı

Bu rehbere başlamadan önce DigitalOcean hesabınızda bir PostgreSQL yönetilen veritabanınızın olduğunu varsayıyoruz. Eğer henüz bir veritabanı oluşturmadıysanız, DigitalOcean kontrol panelinden birkaç tıklamayla kolayca yeni bir PostgreSQL veritabanı oluşturabilirsiniz.

Veritabanınızı oluşturduktan sonra, Python uygulamanızın bağlanabilmesi için gerekli olan bağlantı bilgilerini edinmeniz gerekmektedir. Bu bilgiler genellikle DigitalOcean kontrol panelinizdeki veritabanınızın genel bakış sayfasında “Connection Details” veya “Bağlantı Detayları” bölümünde bulunur. İhtiyacımız olan temel bilgiler şunlardır:

* Hostname (Ana Bilgisayar Adı): Veritabanınızın IP adresi veya ana bilgisayar adı.
* Port (Bağlantı Noktası): Genellikle PostgreSQL için 25060’tır.
* Database (Veritabanı Adı): Bağlanmak istediğiniz veritabanının adı (varsayılan genellikle defaultdb veya sizin belirlediğiniz bir isimdir).
* Username (Kullanıcı Adı): Veritabanına bağlanmak için kullanılacak kullanıcı adı.
* Password (Şifre): Belirlenen kullanıcının şifresi.
* SSL Mode: DigitalOcean yönetilen veritabanları için genellikle require olarak ayarlanmıştır, bu da güvenli bir bağlantı sağlar.

Bu bilgileri bir yere not edin veya daha iyisi, bir sonraki adımda göstereceğimiz gibi ortam değişkenleri olarak ayarlamaya hazır olun. Unutmayın, bu bilgiler hassas olduğundan, kodunuzun içine doğrudan yazmaktan kaçınmalıyız.

Adım 2: Python Ortamını Kurma ve Gerekli Kütüphaneleri Yükleme

PostgreSQL veritabanı ile Python arasında iletişim kurmak için psycopg2 adlı popüler bir adaptör kütüphanesini kullanacağız. Bu kütüphane, Python’dan PostgreSQL’e SQL sorguları göndermenize ve sonuçları almanıza olanak tanır.

2.1. Sanal Ortam Oluşturma

Python projeleriniz için her zaman sanal ortam (virtual environment) kullanmanız şiddetle tavsiye edilir. Bu, projenizin bağımlılıklarını sisteminizdeki diğer Python projelerinden izole etmenizi sağlar.

Terminalinizi açın ve projeniz için bir dizin oluşturun, ardından bu dizine gidin:

mkdir digitalocean_pg_python
cd digitalocean_pg_python

Şimdi bir sanal ortam oluşturalım ve onu etkinleştirelim:

python3 -m venv venv

* Linux/macOS:

source venv/bin/activate

* Windows:

.\venv\Scripts\activate

Sanal ortamınız etkinleştirildiğinde, terminal istemcinizin başında (venv) gibi bir ifade göreceksiniz.

2.2. psycopg2 Kütüphanesini Yükleme

Sanal ortamınız etkin durumdayken, psycopg2-binary paketini yükleyelim. psycopg2-binary, önceden derlenmiş bir sürüm olduğu için kurulumu daha kolaydır ve çoğu kullanım durumu için yeterlidir.

pip install psycopg2-binary python-dotenv

Burada python-dotenv paketini de yüklüyoruz. Bu paket, hassas veritabanı bağlantı bilgilerimizi .env dosyasından okuyarak güvenliği artırmamıza yardımcı olacaktır.

Adım 3: Python ile PostgreSQL Veritabanına Bağlanma ve Temel İşlemler

Şimdi Python kodumuzu yazmaya başlayabiliriz. İlk olarak, veritabanı bağlantı bilgilerimizi güvenli bir şekilde yönetmek için bir .env dosyası oluşturalım.

3.1. .env Dosyası Oluşturma

digitalocean_pg_python dizininizde config.py adında bir dosya oluşturun ve içine DigitalOcean kontrol panelinizden aldığınız bağlantı bilgilerini ekleyin:

# .env dosyası
DB_HOST=your_digitalocean_db_host
DB_NAME=defaultdb
DB_USER=doadmin
DB_PASSWORD=your_db_password
DB_PORT=25060

your_digitalocean_db_host, your_db_password gibi yerleri kendi gerçek bilgilerinizle değiştirmeyi unutmayın. Bu dosyanın .gitignore dosyanıza eklenerek versiyon kontrol sistemlerine yüklenmemesi gerektiğini unutmayın!

3.2. Python Kodu ile Bağlantı ve CRUD İşlemleri

Şimdi app.py adında yeni bir Python dosyası oluşturalım ve içine aşağıdaki kodu yapıştıralım:

import psycopg2
import os
from dotenv import load_dotenv

.env dosyasındaki değişkenleri yükle

load_dotenv()

Ortam değişkenlerinden bağlantı bilgilerini al

DB_HOST = os.getenv("DB_HOST") DB_NAME = os.getenv("DB_NAME") DB_USER = os.getenv("DB_USER") DB_PASSWORD = os.getenv("DB_PASSWORD") DB_PORT = os.getenv("DB_PORT")

Veritabanı bağlantı nesnesi

conn = None cur = None try: # 1. Veritabanına Bağlanma print("Veritabanına bağlanılıyor...") conn = psycopg2.connect( host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD, port=DB_PORT, sslmode='require' # DigitalOcean için genellikle 'require' ) cur = conn.cursor() print("Veritabanına başarıyla bağlanıldı!") # 2. CRUD İşlemleri # 2.1. CREATE (Tablo Oluşturma) print("\n'kullanicilar' tablosu oluşturuluyor (varsa atlanacak)...") cur.execute(""" CREATE TABLE IF NOT EXISTS kullanicilar ( id SERIAL PRIMARY KEY, ad VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, kayit_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """) conn.commit() # Değişiklikleri veritabanına kaydet print("Kullanicilar tablosu oluşturuldu veya zaten mevcut.") # 2.2. INSERT (Veri Ekleme) print("\nYeni kullanıcılar ekleniyor...") try: cur.execute("INSERT INTO kullanicilar (ad, email) VALUES (%s, %s)", ("Ahmet Yılmaz", "ahmet@example.com")) cur.execute("INSERT INTO kullanicilar (ad, email) VALUES (%s, %s)", ("Ayşe Demir", "ayse@example.com")) conn.commit() print("Kullanıcılar başarıyla eklendi.") except psycopg2.errors.UniqueViolation: conn.rollback() # Hata durumunda işlemi geri al print("Bazı kullanıcılar zaten mevcut olduğu için eklenemedi (UniqueViolation).") except Exception as e: conn.rollback() print(f"Kullanıcı eklenirken bir hata oluştu: {e}") # 2.3. SELECT (Veri Okuma) print("\nTüm kullanıcılar listeleniyor:") cur.execute("SELECT id, ad, email, kayit_tarihi FROM kullanicilar ORDER BY id ASC") rows = cur.fetchall() # Tüm sonuçları al if rows: for row in rows: print(f"ID: {row[0]}, Ad: {row[1]}, Email: {row[2]}, Kayıt Tarihi: {row[3]}") else: print("Henüz hiç kullanıcı yok.") # Belirli bir kullanıcıyı seçme print("\nBelirli bir kullanıcı aranıyor (email: ahmet@example.com):") cur.execute("SELECT id, ad, email FROM kullanicilar WHERE email = %s", ("ahmet@example.com",)) ahmet = cur.fetchone() # Tek bir sonuç al if ahmet: print(f"Bulunan Kullanıcı: ID: {ahmet[0]}, Ad: {ahmet[1]}, Email: {ahmet[2]}") else: print("Ahmet Yılmaz bulunamadı.") # 2.4. UPDATE (Veri Güncelleme) print("\nBir kullanıcının adı güncelleniyor (email: ahmet@example.com)...") cur.execute("UPDATE kullanicilar SET ad = %s WHERE email = %s", ("Ahmet Can Yılmaz", "ahmet@example.com")) conn.commit() print("Kullanıcı başarıyla güncellendi.") # Güncellenmiş veriyi tekrar sorgula print("\nGüncelleme sonrası kullanıcı listesi:") cur.execute("SELECT id, ad, email FROM kullanicilar WHERE email = %s", ("ahmet@example.com",)) updated_ahmet = cur.fetchone() if updated_ahmet: print(f"Güncellenen Kullanıcı: ID: {updated_ahmet[0]}, Ad: {updated_ahmet[1]}, Email: {updated_ahmet[2]}") # 2.5. DELETE (Veri Silme) print("\nBir kullanıcı siliniyor (email: ayse@example.com)...") cur.execute("DELETE FROM kullanicilar WHERE email = %s", ("ayse@example.com",)) conn.commit() print("Kullanıcı başarıyla silindi.") # Silme sonrası kontrol print("\nSilme sonrası tüm kullanıcılar listeleniyor:") cur.execute("SELECT id, ad, email FROM kullanicilar ORDER BY id ASC") rows_after_delete = cur.fetchall() if rows_after_delete: for row in rows_after_delete: print(f"ID: {row[0]}, Ad: {row[1]}, Email: {row[2]}") else: print("Silme sonrası hiç kullanıcı kalmadı.") except psycopg2.Error as e: print(f"Veritabanı hatası oluştu: {e}") # Hata durumunda bekleyen tüm işlemleri geri al if conn: conn.rollback() except Exception as e: print(f"Genel bir hata oluştu: {e}") finally: # Bağlantıyı ve imleci kapat if cur: cur.close() if conn: conn.close() print("\nVeritabanı bağlantısı kapatıldı.")

Bu kodu çalıştırdığınızda, terminalinizde veritabanına bağlanıldığını, tablo oluşturulduğunu, verilerin eklendiğini, güncellendiğini ve silindiğini gösteren çıktıları göreceksiniz.

Kod Açıklamaları:

* load_dotenv(): .env dosyasındaki ortam değişkenlerini Python ortamına yükler.
* os.getenv(): Ortam değişkenlerinden bağlantı bilgilerini güvenli bir şekilde alır. Bu, hassas bilgilerin kodunuzda sabit kodlanmasını engeller.
* psycopg2.connect(): Veritabanına bir bağlantı kurar. sslmode='require' DigitalOcean’da güvenli bağlantı için önemlidir.
* conn.cursor(): Veritabanında SQL komutlarını yürütmek için bir imleç (cursor) nesnesi oluşturur. Tüm sorgular bu imleç üzerinden yapılır.
* cur.execute(sql_query, (parameters,)): SQL sorgusunu yürütür. Parametreleri doğrudan sorgu dizesine katıştırmak yerine %s kullanarak ve bir tuple içinde geçirmek, SQL enjeksiyon saldırılarını önlemek için kritik öneme sahiptir.
* conn.commit(): INSERT, UPDATE, DELETE gibi veri değiştiren işlemlerden sonra değişiklikleri veritabanına kalıcı olarak kaydeder. Bir işlem (transaction) başlatır ve bitirir.
* conn.rollback(): Bir hata oluştuğunda veya işlemi iptal etmek istediğinizde, commit() yapılmadan önceki tüm değişiklikleri geri alır.
* cur.fetchall(): SELECT sorgusundan dönen tüm sonuçları bir liste olarak alır. Her satır bir tuple’dır.
* cur.fetchone(): SELECT sorgusundan dönen ilk sonucu bir tuple olarak alır.
* try...except...finally: Hata yönetimi için kullanılır. finally bloğu, bir hata olsa bile bağlantının ve imlecin düzgün bir şekilde kapatılmasını sağlar. Bu, kaynak sızıntılarını önler.
* psycopg2.errors.UniqueViolation: PostgreSQL’den dönen belirli bir hata türünü (örneğin, benzersiz bir sütuna zaten var olan bir değer eklemeye çalışma) yakalamak için kullanılır.

En İyi Uygulamalar ve Güvenlik İpuçları

Veritabanı etkileşimleri yaparken bazı en iyi uygulamaları ve güvenlik ipuçlarını göz önünde bulundurmak, uygulamanızın daha sağlam ve güvenli olmasını sağlar.

H3.1. Ortam Değişkenlerini Kullanın

Veritabanı kimlik bilgileri, API anahtarları gibi hassas bilgileri asla doğrudan kodunuzun içine yazmayın. Bunun yerine, .env dosyaları veya sunucunuzun ortam değişkenleri gibi yöntemler kullanarak bu bilgileri dışarıda tutun. python-dotenv kütüphanesi bu konuda büyük kolaylık sağlar. Bu sayede kodunuzu GitHub gibi platformlarda paylaşırken hassas bilgilerin açığa çıkmasını engellersiniz.

H3.2. SQL Enjeksiyonuna Karşı Koruma

psycopg2 kütüphanesini kullanırken SQL sorgularına değişken değerleri eklemek için parametreli sorguları (%s ve bir tuple kullanma) kullanın. Asla Python f-string’leri veya string birleştirme ile doğrudan kullanıcı girdisini SQL sorgusuna katıştırmayın. cur.execute("SELECT FROM users WHERE username = '%s'" % user_input) gibi kullanımlar SQL enjeksiyonuna açıktır. Doğru kullanım cur.execute("SELECT FROM users WHERE username = %s", (user_input,)) şeklindedir.

H3.3. Bağlantı Havuzu (Connection Pooling) Kullanımı

Özellikle web uygulamaları gibi birden fazla eşzamanlı isteğin olduğu durumlarda, her istek için yeni bir veritabanı bağlantısı açmak ve kapatmak performans düşüşüne neden olabilir. Bağlantı havuzu (connection pooling), önceden açılmış bağlantıları yeniden kullanarak bu yükü azaltır. psycopg2‘nin kendi bağlantı havuzu modülleri (psycopg2.pool) veya SQLAlchemy gibi ORM’ler bu özelliği sunar. Küçük betikler için gerekli olmasa da, daha büyük projelerde düşünülmesi gereken bir optimizasyondur.

H3.4. İşlem Yönetimi (Transaction Management)

Veritabanı işlemlerini her zaman conn.commit() ve conn.rollback() ile yönetin. Bir dizi veritabanı değişikliğinin atomik (ya hepsi gerçekleşir ya da hiçbiri) olmasını sağlamak için tüm değişiklikleri tek bir try...except bloğu içinde toplayın ve yalnızca tüm işlemler başarılı olursa commit() yapın. Herhangi bir hata durumunda rollback() yaparak veritabanını tutarlı bir duruma geri getirin.

H3.5. Bağlantıları Kapatmayı Unutmayın

try...except...finally bloğunu kullanarak veritabanı bağlantılarının ve imleçlerinin her zaman kapatıldığından emin olun (cur.close(), conn.close()). Bu, veritabanı kaynaklarının gereksiz yere meşgul edilmesini önler ve uygulamanızın kararlılığını artırır.

Sonuç ve Sıkça Sorulan Sorular (SSS)

Bu rehberde, DigitalOcean’daki PostgreSQL veritabanınıza Python kullanarak nasıl bağlanacağınızı ve temel CRUD işlemlerini nasıl gerçekleştireceğinizi öğrendiniz. psycopg2 kütüphanesini kullanarak güvenli ve etkili bir şekilde veritabanı etkileşimleri kurabilir, uygulamalarınız için güçlü bir veri katmanı oluşturabilirsiniz. Unutmayın, pratik yapmak ve öğrendiklerinizi kendi projelerinizde uygulamak, bu bilgileri pekiştirmenin en iyi yoludur.

Sıkça Sorulan Sorular (SSS)

S1: psycopg2 ve psycopg2-binary arasındaki fark nedir?
C1: psycopg2-binary, önceden derlenmiş bir pakettir ve çoğu işletim sistemi için kolayca pip install ile kurulabilir. psycopg2 ise, yükleme sırasında yerel C derleyicisine (örneğin, pg_config ve PostgreSQL geliştirme başlıklarına) ihtiyaç duyar. Çoğu geliştirici için psycopg2-binary daha kolay bir seçenektir, ancak özel derleme gerektiren veya daha fazla kontrol isteyen durumlar için psycopg2 tercih edilebilir.

S2: Bağlantı neden kapanmıyor gibi görünüyor veya “too many connections” hatası alıyorum?
C2: Bu genellikle bağlantıları düzgün bir şekilde kapatmadığınız anlamına gelir. try...except...finally bloğunun finally kısmında cur.close() ve conn.close() çağrılarını yaptığınızdan emin olun. Ayrıca, yoğun uygulamalarda bağlantı havuzu (connection pooling) kullanmayı düşünebilirsiniz.

S3: DigitalOcean’da veritabanı şifremi unuttum, ne yapmalıyım?
C3: DigitalOcean kontrol panelinizden veritabanınızın ayarlarına giderek şifrenizi sıfırlayabilirsiniz. “Users & Databases” veya “Kullanıcılar ve Veritabanları” bölümünde, ilgili kullanıcının şifresini sıfırlama seçeneğini bulacaksınız.

S4: OperationalError alıyorum, bu ne anlama geliyor?
C4: OperationalError genellikle bağlantı sorunlarını gösterir. Şunları kontrol edin:
* Bağlantı bilgileriniz (host, port, database, user, password) doğru mu?
* DigitalOcean veritabanınız çalışır durumda mı?
* Uygulamanızın çalıştığı sunucudan DigitalOcean veritabanına ağ erişimi var mı (güvenlik duvarı kuralları)?
* sslmode='require' ayarı doğru mu?

S5: Birden fazla tablom var, aynı veritabanı bağlantısını kullanabilir miyim?
C5: Evet, bir veritabanı bağlantısı (connection) üzerinden birden fazla imleç (cursor) oluşturabilir ve farklı tablolar üzerinde işlemler gerçekleştirebilirsiniz. Bağlantı, tüm veritabanına erişimi sağlar; imleç ise SQL sorgularını yürütmek için bir aracıdır.

Bu rehberin DigitalOcean ve Python ile PostgreSQL yolculuğunuzda size yardımcı olduğunu umuyoruz. Başarılar dileriz!

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.