Форум сайта python.su
Добрый день!
Пишу REST full приложение - клиентская часть на AngularJS, серверная на Pyramid с надстройкой cornice, для работы с БД (Postgres) использую SQLAlchemy. Все общение между клиентом-сервером - HTTP запросы и JSON. В связи с появившейся нативной поддержкой JSON'а в PostgreSQL 9.2 встал закономерный вопрос: а как возвращать результаты SELECT'ов клиенту сразу в JSON формате? Ничего похожего не нашел… Можно средствами алхимии вернуть raw json прямо из базы? Понятно что можно писать raw sql, но геморно: запросы в основном динамические, в этом алхимия помогает.
Для конкретики:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.schema import Column from sqlalchemy.types import Integer, String Base = declarative_base() class Person(Base): __tablename__ = 'person' person_id = Column(Integer, primary_key=True) fam = Column(String(30)) im = Column(String(20)) otch = Column(String(30)) ...
SELECT array_to_json(array_agg(row_to_json(t))) FROM ( SELECT fam, im, otch FROM person LIMIT 3 ) t
[{"fam":"Матвеев","im":"Андрей","otch":"Валентинович"},{"fam":"Ряховская","im":"Наталья","otch":"Валерьевна"},{"fam":"Торбин","im":"Андрей","otch":"Александрович"}]
from cornice.resource import resource from sqlalchemy.sql.expression import and_ from vipc.views import dict_from_request from vipc.models import db from vipc.models.org import Person @resource(collection_path='/api/persons/', path='/api/person/{pk}') class PersonService(object): def __init__(self, request): self.request = request def collection_post(self): data = {} filters = [] request_params = dict_from_request(self.request) fam = request_params['fam'].strip().replace('*', '%') if len(fam) > 0: filters.append(Person.fam.ilike(fam)) if len(filters) > 0: data = db.query(Person.fam, Person.im, Person.otch).filter(and_(*filters)) return {'data': data}
Отредактировано nuriahmetov (Март 26, 2013 13:07:33)
Офлайн
http://www.sqlalchemy.org/trac/ticket/2581 похоже без raw sql пока нельзя
Офлайн