Flask ve SQLAlchemy ile Raw Queryler Çalıştırmak

Selamlar. Flask ile proje çalışmalarım devam ediyor. Bu yazıda da raw queryler hakkında bilgi vermeye çalışacağım.

Tabii bu yazıdaki queryler INSERT, UPDATE ve SELECT şeklinde olacak. Öncelikle ORM kullanıyorsanız böyle queryleri manuel yazmanıza gerek yoktur. Sonuçta bu ORM’ler o tarz queryler de düşünülerek ortaya çıkan kütüphaneler oluyor.

Fakat ben querylerimi kendim yazarım, ORM bana karışamaz, buranın agası benim diyorsanız eğer size sağlanan kolaylıklar var.

Öncelikle UPDATE sorgusu yazacağımızı varsayalım.

Raw Update Nasıl Oluyo??

Kısacası şöyle;

result = db.session.execute("UPDATE user SET Name = :Name WHERE ID = :ID", { "ID": 1, "Name": "Ali GOREN" })

db.session.commit()

Burada UPDATE sorgusunun içeriğini anlatmaya gerek duymuyoruz. Sadece burada ":ID" için aslında placeholder şeklinde açıklama yapabilirim. Bu bence en basit tanım olabilir yani.

Tek başına execute etmeniz yetmiyor yani. Bir de gidip bunu commitlemeniz gerekiyor ne garip. Fakat ilki böyle yani.

E Hacı Hani Raw Select?

Bence burada Query API tarafında sağlanan en büyük güzellik bu. Yazan arkadaşların ellerine sağlık.

result = User.query.from_statement(
        db.text("SELECT * FROM user WHERE ID = :ID")
    ).params(ID=1)

Kısacası from_statement metodunu kullanarak text select ifadesini çalıştırırsınız. Sonucunda da parametreleri belirtirsiniz. Yukarıdaki session üzerinde yer alan execute ile aynı şekilde çalışıyor.

Tabii bunda sonucu iterable olarak çekmek istiyorsanız ya da dict şekilde çekmek istiyorsanız yukarıdaki update’in gönderildiği execute’a göre farklı bir kaç metod chain etmelisiniz. Örnek;


name = result.first().name

email = result.one().email

first_user_name = result.all()[0].name

Bu şekilde çalışabiliyorsunuz kısacası. Tabii yukarıdaki from_statement sadece select sorgularını textual querylerden alarak çalıştırır.

Bu arada select sorgularını namedtuple olarak çevirmeniz size kolaylık sağlayabilir. Örnek;

result = db.session.execute("SELECT * FROM user")

from collections import namedtuple

user_tuple = namedtuple('users', result.keys())

users = [user_tuple(*u) for u in result.fetchall()]

for user in users:
    print(user.email)

Böyle olması bence sizin için çok daha büyük kolaylık sağlayacaktır. Umarım faydalı bir yazı olmuştur. Olsun lütfen 😛 Hatalı yerler ya da eksik noktaları var ise belirtirseniz yazıyı güncellerim.

Okuduğunuz için teşekkür ederim.

Kaynaklar