SQLAlchemy smooth queries

Октябрь 2, 2009

Допустим, что имеется таблица A и дочерняя таблица B и нам нужны следующие запросы :

  • Все записи из А у которых поле Title like ‘something’;
  • Число этих записей;
  • Все записи из A, у которых есть дочерние записи в B и поле Title like «something»;
  • Все записи из A, у которых нет дочерних записей в B и поле Title like «something»;
  • Число этих записей;
  • Думаю, что вы уловили суть — различные комбинации различных условий

Можно попробовать написать запросы вида «SELECT FROM A WHERE… INNER JOIN …», а для получения числа записей «SELECT COUNT(A.*) FROM…» и т.д. Однако, если условия изменятся, то мне нужно будет поменять их в нескольких местах, в т.ч. потребуется переписать запросы select и select count . Можно, конечно, придумать определенную логику для работы со строками, чтобы избавится от дупликаций и иметь возможность изменять условия в одном месте, а можно воспользоваться ORM SQLAlchemy, которая позволяет записывать запросы следующим образом:

def getQuery(key):

	Cond1 = A.Title.like("something")
        from sqlalchemy.sql import exists
        from sqlalchemy import and_,desc, or_
	HasChildren = exists().where(B.Parent == A.ID)
	Cond2 = and_(Cond1, HasChildren )
	Cond3  = and_(Cond1, ~HasChildren )	

	return locals()[key]

def GetQuery(session, conditions):
	return session.query(A).filter(conditions)

def GetByFilter(filterName):
	s = get_session()
	try:
		return GetQuery(s, getQuery(filterName)).all()
	finally:
		s.close()

def GetCount(filterName):
	s = get_session()
	try:
		return GetQuery(s, getQuery(filterName)).count()
	finally:
		s.close()

Итого:

  • Одно множество запросов для выоборки данных и количества записей;
  • Один набор условий, которые можно комбинировать по AND, OR, EXISTS и т.д.;
  • Весьма читабельный код.

tags:
posted in Python by dmitko

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org