пятница, 12 июля 2013 г.

Cоздание собственных операторов в sqlalchemy

В postgresql есть такие типы данных как INET, CIDR, но полноценно в sqlalchemy они не поддерживаются. То есть, например, запрос для поиска подсетей
SELECT * FROM nets WHERE ip >> '10.10.10.10' так просто сформулировать на sqlalchemy не получится. Для этого нужно переопределить оператор >> у типа данных CIDR и создавать запросы с его помощью:

class Cidr(postgresql.CIDR):
'''
Делаем свой тип колонки для того, чтобы была возможность использовать
операторы >> и <<
'''

class comparator_factory(postgresql.CIDR.Comparator):
def __lshift__(self, other):
return self.op("<<")(other)

def __rshift__(self, other):
return self.op(">>")(other)

class Net(Base):
__tablename__ = 'nets'
id = Column(Integer, primary_key=True)
ip = Column(Cidr)

db.session.query(Net).filter(Net.ip>>'10.10.10.10')

Комментариев нет:

Отправить комментарий