Python Flask ile SQLAlchemy ORM Kullanımı

image

08 Jul 2024

Bu blog yazısında, Python'un popüler web framework'ü Flask ile birlikte SQLAlchemy ORM'in nasıl kullanıldığını detaylı bir şekilde ele alacağız. Flask uygulamanıza veritabanı entegrasyonunu ve ORM yapısının temellerini öğreneceksiniz. 

Python, web geliştirme için oldukça popüler bir dil ve Flask, hafif ve esnek yapısıyla öne çıkan bir web framework'ü. Veritabanı işlemlerini kolaylaştırmak için SQLAlchemy gibi bir ORM (Object-Relational Mapping) kullanmak, veritabanı ile Python arasında köprü görevi görür. Bu rehberde, Flask uygulamanızda SQLAlchemy kullanarak nasıl veritabanı işlemleri yapabileceğinizi adım adım anlatacağız.

İçindekiler

  1. Flask ve SQLAlchemy Kurulumu
  2. Veritabanı Bağlantısı
  3. Model Tanımları
  4. Veritabanı İşlemleri (CRUD)
  5. İlişkiler (Relationships)
  6. Migration İşlemleri
  7. Örnek Proje

1. Flask ve SQLAlchemy Kurulumu

Öncelikle Flask ve SQLAlchemy paketlerini yüklememiz gerekiyor. Bunun için terminalde aşağıdaki komutları kullanabilirsiniz:

pip install Flask
pip install Flask-SQLAlchemy

Bu komutlar, Flask ve SQLAlchemy kütüphanelerini projenize dahil eder.

2. Veritabanı Bağlantısı

Flask uygulamanıza veritabanı bağlantısını tanımlamak için Flask-SQLAlchemy'yi kullanacağız. app.py dosyanızda aşağıdaki gibi bir yapı oluşturabilirsiniz:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

Burada, SQLALCHEMY_DATABASE_URI ile SQLite veritabanına bağlandık. Diğer veritabanı türleri (PostgreSQL, MySQL vb.) için bağlantı URI'si farklı olacaktır.

3. Model Tanımları

SQLAlchemy ile veritabanı modellerini sınıflar olarak tanımlayabilirsiniz. Aşağıda basit bir User modeli örneği bulunmaktadır:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

Bu model, users adında bir tablo oluşturur ve id, username ve email sütunlarını tanımlar.

4. Veritabanı İşlemleri (CRUD)

CRUD işlemleri, veri tabanı ile ilgili temel işlemleri kapsar: Create, Read, Update ve Delete. SQLAlchemy ile bu işlemleri kolayca yapabilirsiniz.

Veri Ekleme (Create)

new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()

Veri Okuma (Read)

user = User.query.filter_by(username='john').first()
print(user.email)

Veri Güncelleme (Update)

user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
db.session.commit()

Veri Silme (Delete)

user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()

5. İlişkiler (Relationships)

Veritabanı modelleri arasında ilişkiler tanımlamak da mümkündür. Aşağıda, User ve Post modelleri arasındaki bir ilişki örneği verilmiştir:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

Bu örnekte, bir User birden fazla Post yazabilir ve her Post bir User'a aittir.

6. Migration İşlemleri

Veritabanı şemasında değişiklikler yapmak için Flask-Migrate paketini kullanabilirsiniz. Bu paket, veritabanı migration işlemlerini yönetmenizi sağlar. Kurulum ve kullanımı şu şekildedir:

pip install Flask-Migrate

app.py dosyanıza aşağıdaki kodları ekleyin:

from flask_migrate import Migrate

migrate = Migrate(app, db)

Migration komutlarını kullanmak için terminalde aşağıdaki komutları çalıştırabilirsiniz:

flask db init
flask db migrate -m "Initial migration."
flask db upgrade

7. Örnek Proje

Tüm bu bilgileri kullanarak basit bir blog uygulaması oluşturabilirsiniz. Aşağıda, Flask ve SQLAlchemy kullanarak oluşturulmuş basit bir blog uygulamasının tam örneğini bulabilirsiniz:

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    new_user = User(username=data['username'])
    db.session.add(new_user)
    db.session.commit()
    return jsonify({'message': 'User created'}), 201

@app.route('/posts', methods=['POST'])
def create_post():
    data = request.get_json()
    user = User.query.filter_by(username=data['username']).first()
    if user is None:
        return jsonify({'message': 'User not found'}), 404
    new_post = Post(title=data['title'], content=data['content'], author=user)
    db.session.add(new_post)
    db.session.commit()
    return jsonify({'message': 'Post created'}), 201

if __name__ == '__main__':
    app.run(debug=True)

Bu rehberde, Flask ve SQLAlchemy kullanarak nasıl veritabanı işlemleri yapabileceğinizi detaylı bir şekilde ele aldık. Bu bilgilerle kendi projelerinizi geliştirirken veritabanı entegrasyonunu kolayca sağlayabilirsiniz.