Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2009 14:26:11

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

Есть запрос query(Uer.id, User.name, Address.city_id, Address.street_id).join(Address). Как можно взять столбец в виде объекта(Uer.id или Address.city_id) по индексу? Что бы было понятно, это нужно для сортировки. Что-то типа такого: query(Uer.id, User.name, Address.city_id, Address.street_id).join(Address).order_by(q) и сортируется по User.name.



Офлайн

#2 Апрель 11, 2009 17:47:07

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

Я немного порылся в коде и нашел метода _entities + desc из sqlalchemy.sql.expression. И получается запрос:

from sqlalchemy.sql.expression import desc
items = query(Uer.id, User.name, Address.city_id, Address.street_id).join(Address)
items = items.order_by(desc(items._entities[1]))
Итадакимас ^_^



Офлайн

#3 Апрель 12, 2009 02:52:15

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Свойства запрос в SqlAlchemy

А чем .order_by(User.id.desc()) не устраивает?
Или ты заранее не знаешь, какие будут поля в запросе?

p.s. Я бы не рекомендовал использовать это скрытое поле. Если тебе заранее не известны атрибуты, по которым выполняется запрос, лучше передавай их (кому там это надо) отдельно от объекта Query.

..bw



Отредактировано (Апрель 12, 2009 05:10:25)

Офлайн

#4 Апрель 12, 2009 03:57:09

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Свойства запрос в SqlAlchemy

bw
+1



Офлайн

#5 Апрель 12, 2009 10:13:19

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

bw Не известно. Я использую плагин к jQuery jqGrid. Там есть сортировка и можно указывать все это, но занимает много строк, для сокращения я сделал функцию, которая все это вычисляет легко и просто :)



Офлайн

#6 Апрель 13, 2009 03:42:35

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Свойства запрос в SqlAlchemy

Ты хоть проверяешь объекты, что бы они были sqlalchemy.orm.query._ColumnEntity? И предпринимаешь действия, если что-то не так?
Например, протоколируешь ошибку, возвращаешь результат без сортировки, сигналишь пользователю, что что-то не так.

..bw



Офлайн

#7 Апрель 16, 2009 16:23:56

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

где проверять это? сигналить там не нужно, если только хакерам :)
JS передает номер столбца, по ней и делается сортировка.



Офлайн

#8 Апрель 17, 2009 05:50:38

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

Naota
JS передает номер столбца, по ней и делается сортировка.
Я тоже использовал jqGrid. Никаких извращений с индексом не понадобилось. Написал виджет к TurboGears для вывода грида и простенький декоратор в котором делается и сортировка и поиск и пейджинатор



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#9 Апрель 17, 2009 20:48:22

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

Я сделал это так:

def items(self):
items = sas.query(...)
records, total, items = GridParams(items, p)
rows = []
for i in items:
rows.append(u'{id:"%s", cell:["%s","%s","%s","%s","%s","%s"]}'%
(i[0],i[0],i[1],i[2],i[3],i[4],i[5]))
return u'''{total:%i,page:%i,records:%i,rows:[%s]}'''%(total,p.page,records,','.join(rows))

def GridParams(items, p):
records = items.count()
if records == 0: return 0, 0, items
total = records/p.rows
if records%p.rows != 0: total += 1
if p.sidx >= len(items._entities): return
item = items._entities[p.sidx]
if p.sord == 'desc': item = desc(item)
items = items.order_by(item).offset((p.page-1)*p.rows).limit(p.rows)
return records, total, items
В p содержатся параметры запроса: sord,sidx,rows,page.
А вы PooH как сделали?



Офлайн

#10 Апрель 18, 2009 21:16:15

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Свойства запрос в SqlAlchemy

Новый вариант:

def items(self):
items = sas.query(...)
sf = '"%(id)s","%(fio)s","%(part)s","%(stones)s","%(note)s","%(cost)s","%(count)s",""'
return TableToJson(items, p, sf)

class RowsToJson(dict):

def __init__(self, items, sf):
self.columns = self._to_dict(items)
self.cells = None
self.result = ','.join([sf%self(i) for i in items])
dict.__init__(self)

def __getitem__(self, label):
item = self.cells[self.columns[label]]
if type(item) in (str, unicode):
item = item.replace('"','\\"')
return item

def __str__(self):
return self.result

def __call__(self, cells):
self.cells = cells
return self

def _to_dict(self, items):
d = {}
for i, c in enumerate(items._entities): d[c.column.key] = i
return d

def TableToJson(items, p, sf):
records = items.count()
if records == 0: '{total:0,page:0,records:0}'
total = records/p.rows
if records%p.rows != 0: total += 1
if p.sidx >= len(items._entities): return
item = items._entities[p.sidx]
if p.sord == 'desc': item = desc(item)
items = items.order_by(item).offset((p.page-1)*p.rows).limit(p.rows)
rows = RowsToJson(items, '{id:"%(id)s", cell:['+sf+']}')
return '{total:%i,page:%i,records:%i,rows:[%s]}'%(total,p.page,records,rows)
Есть какие замечания и идеи?



Отредактировано (Апрель 18, 2009 21:39:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version