Уведомления

Группа в Telegram: @pythonsu

#1 Март 26, 2013 12:43:59

nuriahmetov
От: Казань
Зарегистрирован: 2013-03-26
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Postgres 9.2 SQLAlchemy JSON

Добрый день!

Пишу 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))
    ... 

На SQL пишу так:
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":"Александрович"}]

Т.е. результат - тот что нужен. А как такое сделать используя алхимию (или минуя ее)?
Контроллер на cornice (упрощено):
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}

Сornice по-умолчанию сериализует возвращаемые данные в JSON. Собственно вопрос:
Как вернуть из контролера (collection_post) данные в JSON формате, минуя их формирование Сornice'ом-python'ом?

В качестве дополнения.

В development ветке Psycopg 2.5.dev0, в модуле extras есть хелперы, в том числе и для работы с JSON. Но они работают с типом JSON самой базы.

JSON adaptation


python 2.7, postgresql 9.2, psycopg2 2.4.6, sqlalchemy 0.8, pyramid 1.4, cornice 0.13

Отредактировано nuriahmetov (Март 26, 2013 13:07:33)

Офлайн

#2 Март 30, 2013 11:11:33

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Postgres 9.2 SQLAlchemy JSON

http://www.sqlalchemy.org/trac/ticket/2581 похоже без raw sql пока нельзя

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version