0Pricing
Pandas & NumPy Academy · Ders

SQLAlchemy ile Veritabanına Bağlanma

SQLite ve PostgreSQL için bir SQLAlchemy altyapısı oluşturun ve bir tabloyu DataFrame'e yüklemek üzere bunu pd.read_sql işlevine aktarın.

SQLAlchemy ile Veritabanına Bağlanma, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

Pandas'ı Veritabanlarına Neden Bağlamalı?

Üretim verilerinin çoğu CSV dosyalarında değil, ilişkisel veritabanlarında (PostgreSQL, MySQL, SQLite veya SQL Server) bulunur. Pandas'ı doğrudan bir veritabanına bağlamak; önce CSV'ye aktarmadan verileri bir DataFrame'e sorgulamanıza, temizlenmiş DataFrame'leri tablolara geri göndermenize ve Python'ın analitik gücünü veritabanının dizin oluşturma ve birleştirme yetenekleriyle bir araya getirmenize olanak tanır. Pandas ile veritabanları arasındaki köprü, Python'ın standart veritabanı soyutlama kütüphanesi olan SQLAlchemy'dir.

SQLAlchemy'yi Yükleme

SQLAlchemy, bir Python SQL araç seti ve ORM'dir. Pandas bütünleştirmesi için ORM'ye değil, yalnızca Core katmanına ihtiyacınız vardır. pip install sqlalchemy ile yükleyin. Ayrıca veritabanına özgü sürücüye de ihtiyacınız vardır: PostgreSQL için psycopg2, MySQL için pymysql veya SQLite için (Python ile birlikte gelir) sqlite3. SQLAlchemy bir soyutlama katmanı görevi görür; yalnızca bağlantı dizesini değiştirerek aynı Pandas kodu desteklenen tüm veritabanlarıyla çalışır.

# Install dependencies
# pip install sqlalchemy psycopg2-binary  # for PostgreSQL
# pip install sqlalchemy pymysql           # for MySQL
# sqlite3 is built into Python

import sqlalchemy as sa
import pandas as pd

print('SQLAlchemy version:', sa.__version__)

Bağlantı Altyapısı Oluşturma

İlk adım, veritabanı türünü, kimlik bilgilerini, ana bilgisayarı, bağlantı noktasını ve veritabanı adını kodlayan bir SQLAlchemy engine oluşturmak için bir bağlantı URL'si kullanmaktır. engine, veritabanı bağlantıları için bir fabrika görevi görür; gerçekten ihtiyaç duyana kadar bağlantı açmaz. engine'i Pandas'ın pd.read_sql() ve df.to_sql() işlevlerine geçirin. Kimlik bilgilerini asla koda sabitlemeyin; bunları ortam değişkenlerinden veya bir gizli bilgiler yöneticisinden okuyun.

import sqlalchemy as sa
import os

# SQLite (file-based, no server needed)
sqlite_engine = sa.create_engine('sqlite:///mydata.db')

# PostgreSQL
# pg_url = 'postgresql://user:pass@localhost:5432/mydb'
# pg_engine = sa.create_engine(pg_url)

# From environment variable (safer)
# pg_engine = sa.create_engine(os.environ['DATABASE_URL'])

print(sqlite_engine)
print(type(sqlite_engine))

pd.read_sql_table() ile Tablo Okuma

pd.read_sql_table('table_name', con=engine), bir veritabanı tablosunun tamamını bir DataFrame içine okur. Sütun veri türlerini veritabanı şemasından otomatik olarak çıkarır; tam sayılar tam sayı, zaman damgaları datetime olarak kalır. Bu, CSV türü çıkarımından daha kesindir. Ayrıca columns bağımsız değişkeniyle sütunları sınırlayabilir ve varsayılan olmayan veritabanı şemaları için schema ile satırları filtreleyebilirsiniz. Çok büyük tablolarda dikkatli olun: bu işlem her şeyi RAM'e yükler.

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine('sqlite:///sales.db')

# Read a full table
df = pd.read_sql_table('orders', con=engine)
print(df.shape)
print(df.dtypes)
print(df.head())

pd.read_sql_query() ile Sorgu Çalıştırma

pd.read_sql_query('SELECT ...', con=engine), rastgele bir SQL SELECT ifadesini çalıştırır ve sonuçları bir DataFrame olarak döndürür. Bu en esnek yaklaşımdır: Verileri Pandas'a yüklemeden önce SQL içinde filtreleyebilir, birleştirebilir ve toplulaştırabilirsiniz; böylece yalnızca ihtiyacınız olan satır ve sütunlar yüklenir. Sorguyu düz bir Python dizesi olarak yazın. SQL ekleme saldırılarını önlemek için kullanıcı girdisini sorgulara asla birleştirmeyin; parametreli sorgular kullanın.

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine('sqlite:///sales.db')

query = '''
    SELECT customer_id, SUM(amount) AS total_spent,
           COUNT(*) AS num_orders
    FROM orders
    WHERE status = 'completed'
    GROUP BY customer_id
    ORDER BY total_spent DESC
    LIMIT 100
'''

top_customers = pd.read_sql_query(query, con=engine)
print(top_customers.head())

Güvenlik İçin Parametreli Sorgular

Kullanıcı tarafından sağlanan değerlerle dize birleştirerek asla SQL sorguları oluşturmayın; bu, SQL ekleme güvenlik açıklarına yol açar. Bunun yerine parametreli sorgular kullanın: parametreleri, adlandırılmış yer tutucular içeren bir sözlük olarak geçirin. SQLAlchemy kaçışlama işlemini yönetir. Yer tutucuların söz dizimi, SQLAlchemy metin sorgularında :name, psycopg2 tarzı sorgularda ise %(name)s şeklindedir. İyi alışkanlıklar edinmek için dahili betiklerde bile her zaman parametreleştirme kullanın.

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine('sqlite:///sales.db')

# Safe: parameterised query
params = {'status': 'completed', 'min_amount': 500.0}
query = sa.text(
    'SELECT * FROM orders WHERE status = :status AND amount > :min_amount'
)

with engine.connect() as conn:
    df = pd.read_sql_query(query, con=conn, params=params)
print(f'Loaded {len(df)} rows')

Büyük Sorgu Sonuçlarını Parçalar Halinde İşleme

Büyük sorgu sonuçları için pd.read_sql_query() içinde chunksize kullanarak her şeyi bir kerede yüklemek yerine DataFrame'lerden oluşan bir yineleyici alın. Bu yöntem pd.read_csv(chunksize=...) davranışını taklit eder; ancak satırları veritabanından toplu olarak alır. Bunu, RAM'i tüketmeden milyonlarca satırlık sorguların sonuçlarını toplulaştırmak için çalışan bir biriktirici düzeniyle birleştirin.

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine('postgresql://user:pass@host/db')

total = 0.0
count = 0

for chunk in pd.read_sql_query(
    'SELECT amount FROM orders',
    con=engine,
    chunksize=50000
):
    total += chunk['amount'].sum()
    count += len(chunk)

print(f'Mean amount: {total/count:.2f}')

Bağlantı Bağlam Yöneticileri

Bir istisna oluşsa bile bağlantının düzgün şekilde kapatılmasını sağlamak için veritabanı bağlantılarını her zaman bir bağlam yöneticisinin içinde açın (with engine.connect() as conn:). Bağlantıları kapatmayı unutmak, üretim ortamında bağlantı havuzunun tükenmesine yol açar ve yeni sorguların boş bir yuva beklerken takılmasına neden olur. SQLAlchemy'nin bağlantı havuzu sabit sayıda bağlantıyı yönetir ve bağlam yöneticileri kullanıldığında bunları otomatik olarak yeniden kullanıma alır.

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine('sqlite:///sales.db')

# Using context manager — connection always closed properly
with engine.connect() as conn:
    df = pd.read_sql_query(
        'SELECT * FROM products WHERE category = "Electronics"',
        con=conn
    )
    print(f'Products loaded: {len(df)}')
# Connection is automatically returned to the pool here

Veritabanı Şemasını İnceleme

Sorguları yazmadan önce hangi tabloların ve sütunların mevcut olduğunu bilmeniz gerekir. SQLAlchemy'nin Inspector bileşeni, ham SQL yazmadan veritabanı şemasını yansıtmanızı sağlar. inspector.get_table_names() tüm tabloları listeler; inspector.get_columns('table') ise sütun adlarını ve türlerini döndürür. Bu, tanımadığınız veritabanlarıyla çalışırken kullanışlıdır ve PRAGMA table_info() veya \d tablename komutlarını elle çalıştırmaktan daha temizdir.

import sqlalchemy as sa

engine = sa.create_engine('sqlite:///sales.db')
inspector = sa.inspect(engine)

# List all tables
tables = inspector.get_table_names()
print('Tables:', tables)

# Get columns for the 'orders' table
for col in inspector.get_columns('orders'):
    print(f'  {col["name"]}: {col["type"]}')

engine'leri Kapatma ve En İyi Uygulamalar

Uzun süre çalışan betiklerde veya web uygulamalarında, havuzdaki tüm bağlantıları kapatmak için işiniz bittiğinde engine.dispose() çağırın. Kısa betiklerde temizleme işlemini Python'ın çöp toplayıcısı gerçekleştirir. Veri işleme hatlarındaki veritabanı bağlantıları için en iyi uygulamalar şunlardır: engine'i betiğin başında bir kez oluşturup yeniden kullanın, bağlantı havuzu varsayılanlarını (pool_size=5) kullanın ve veritabanı sunucusu sorgular arasında yeniden başlatılırsa otomatik olarak yeniden bağlanmak için pool_pre_ping=True seçeneğini etkinleştirin.

import sqlalchemy as sa

# Production-grade engine creation
engine = sa.create_engine(
    'postgresql://user:pass@host:5432/mydb',
    pool_size=5,          # max 5 persistent connections
    max_overflow=10,      # allow 10 temporary extra connections
    pool_pre_ping=True,   # verify connection before use
    connect_args={'connect_timeout': 10}
)

# ... run all your queries ...

# At the end of the application/script
engine.dispose()
print('Engine disposed')

read_sql ile read_csv Hızını Karşılaştırma

Uygun dizinlere sahip bir veritabanında bulunan veriler için, filtrelenmiş bir sorguyla pd.read_sql_query kullanmak çoğu zaman CSV'ye aktarıp okumaktan daha hızlıdır. Veritabanı sunucusu verileri göndermeden önce filtreleri uygular; böylece ağ üzerinden aktarım ve ayrıştırma yükü azalır. Çok geniş tablolarda veritabanı yalnızca gerekli sütunları da seçebilir. Ancak yavaş bir ağ üzerinden uzak bir veritabanından okumak, yerel bir Parquet dosyasını okumaktan daha yavaş olabilir; kendi kurulumunuz için her iki seçeneğin de performansını mutlaka ölçün.

import pandas as pd
import sqlalchemy as sa
import time

engine = sa.create_engine('sqlite:///data.db')

# Database read with server-side filter
start = time.time()
df_sql = pd.read_sql_query(
    'SELECT * FROM transactions WHERE amount > 100 AND year = 2024',
    con=engine
)
print(f'SQL read: {time.time()-start:.3f}s, {len(df_sql):,} rows')

Kısa Kontrol

Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: sa.create_engine(), bir URL dizesinden yeniden kullanılabilir bir bağlantı fabrikası oluşturur; pd.read_sql_query(), rastgele SQL çalıştırır ve bir DataFrame döndürür; sa.text() ve params ile kullanılan parametreli sorgular SQL ekleme güvenlik açıklarını önler. Sırada Pandas'tan daha karmaşık SQL sorguları çalıştırmayı ve SQL'i Python mantığıyla birleştirmeyi öğreneceğiz.

Sıkça Sorulan Sorular

“SQLAlchemy ile Veritabanına Bağlanma” dersi ücretsiz mi?

Evet — “SQLAlchemy ile Veritabanına Bağlanma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

“SQLAlchemy ile Veritabanına Bağlanma” dersinde ne öğreneceğim?

SQLite ve PostgreSQL için bir SQLAlchemy altyapısı oluşturun ve bir tabloyu DataFrame'e yüklemek üzere bunu pd.read_sql işlevine aktarın. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“SQLAlchemy ile Veritabanına Bağlanma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. SQLAlchemy ile Veritabanına Bağlanma
  2. Pandas'tan SQL Sorguları Çalıştırma
  3. DataFrame'leri Veritabanı Tablolarına Yazma
  4. Pandas ve SQL: Doğru Aracı Seçme
← Pandas & NumPy Academy Sayfasına Dön