SQLAlchemy ile uğraşırken, veritabanından çekilecek nesne listesinin filter() metodu ile filtrelenebildiğini görünce şaşırmadım, ancak bir anlığına, dökümandaki örnek bende “nasıl ya?” etkisi bıraktı:
query.filter(User.name == 'ed') query.filter(User.name != 'ed')
User.name == ‘eq’ kodu, normal şartlar altında, True ya da False üreteceğinden, filter() metoduna gönderilen True/False değeri nasıl istediğim filtrelemeyi sağlayacaktı? Birkaç saniyelik afallamanın ardından, User.name nesnesi (ve ona benzer nesnelerin) “==” operatörünün davranışının, sınıfa ait __eq__ metodu yeniden tanımlanarak değiştirilebileceğini hatırladım:
class Object:
def __init__(self, name):
self.name = name
def __eq__(self, other):
if isinstance(other, Object):
return "%s__equals__%s" % (self.name, other.name)
else:
return "%s__equals__%s" % (self.name, other)
Bu sayede filter() metoduna True/False değerleri yerine, yukarıda yaptığıma benzer bir şekilde, metodun anlayacağı bir formatta veri üretilip gönderilebilirdi. SQLAlchemy’nin koduna bakmadan aklıma gelen bu teoriyi hemen konsolda denedim ve bu yöntemin çalıştığını gördüm:
>>> o1 = Object("object1")
>>> o2 = Object("object2")
>>> o1 == 1
'object1__equals__1'
>>> o1 == o2
'object1__equals__object2'
SQLAlchemy‘deki filter() metodunun, yukarıdakine benzer bir metni işleyip SQL’e çevirmesi yeterliydi, bu da gizemin çözüldüğü anlamına geliyordu :)
Not: Davranışını değiştirebileceğiniz operatörlerin tamamına Python Data Model belgesinden ulaşabilirsiniz.















