18 Mart 2014 Salı

Q Nesnesi ve Tam SQL Sorguları

Q Nesnesi
Sorgulamalarda filter() nesnesini kullanırken birden çok argüman gönderebiliyoruz. Bu gönderdiğimiz argümanlar arasına SQL'de and konur.
>>> doktorlar = Doktor.objects.filter(adi='Ahmet',ucret__lt=1500)
Buradaki filtreleme şu şekilde: Adi Ahmet olan ve ücreti en az 1500 olan Doktorları getir. Dikkat ettiyseniz ve kullandık. Yani sorgu şu şekilde.
Select * from Doktor where adi='Ahmet' AND ucret>1500)
Sorguda AND değilde OR kullanmak istiyorsak Q Nesnesini kullanacağız.
>>> from django.db.models import Q
>>> sorgu = Q(ucret=1500) | Q(ucret=2000)
>>> doktorlar = Doktor.objects.filter(sorgu)
>>> doktorlar
[<Doktor: Rıdvan , Durmaz>, <Doktor: Sevgi , Dönmez>]
Buradaki sorgumuz OR ile birleştirildi. Ücreti 1500 veya 2000 olan doktorları istemiş olduk. SQL sorgusu şu şekilde olacak.
Select * from Doktor Where ucret=1500 OR ucret=2000
Bu sorgulamayı Q Nesnesini kullanmadan şu şekilde de yazabildik.
doktorlar = Doktor.objects.filter(ucret=1500) | Doktor.objects.filter(ucret=2000)
Tam SQL Soguları
Bazen sorgulama yaparken Django'nun bize sunduğu Model sorgulamaları işimizi görmeyebilir. Böyle durumda SQL sorgusunu doğrudan yazarak sorgulama yapabiliriz.
>>> for doktor in Doktor.objects.raw('Select * from ucret_Doktor'):
...     print doktor
Ahmet , Mehmet
Rıdvan , Durmaz
Sevgi , Dönmez
Bu şekilde doğrudan SQL sorguları üzerinden çalışabiliriz.
Not: Sorgu içerisindeki ucret_Doktor kısmındaki ucret uygulamanın adını Doktor ise tablonun adını belirtir.
Eğer istersek sorgudan dönen ilk satırı şu şekilde alabiliriz.
>>> doktor = Doktor.objects.raw('Select * from ucret_Doktor')[0]
>>> doktor
<Doktor: Ahmet , Mehmet>
Dışarıdan değer alabileceğimiz bir sorgulama yapalım.
>>> min_ucret=1500
>>> for doktor in Doktor.objects.raw('Select * from ucret_Doktor where ucret>%s' %min_ucret):
...     print doktor
Rıdvan , Durmaz
SQL sorgularını bir Modele bağlı kalmadan doğrudan işletebiliriz.
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute('Select * from ucret_Doktor')
>>> row = cursor.fetchone()
>>> row
(1, u'Ahmet', u'Mehmet', 1000)
Buradaki fetchone() yerine fetchall() kullanarak tüm satırları döndürebiliriz. Burda cursor.executu() ile istediğimiz sorguyu çalıştırabiliriz.
>>> cursor.execute('Insert into ucret_Doktor(adi,soyadi,ucret) values("Selcuk","Inan",3000)')
>>> veri = cursor.execute('select * from ucret_Doktor')
>>> doktorlar = cursor.fetchall()
>>> doktorlar
[(1, u'Ahmet', u'Mehmet', 1000), (2, u'R\u0131dvan', u'Durmaz', 2000), (3, u'Sevgi', u'D\xf6nmez', 1500), (4, u'Selcuk', u'Inan', 3000)]
Gördüğünüz gibi ekleme sorgusu başarı ile çalıştı.
Kaynakça

0 yorum :

Yorum Gönderme