Найти - Пользователи
Полная версия: Postgres 9.2 SQLAlchemy JSON
Начало » Базы данных » Postgres 9.2 SQLAlchemy JSON
1
nuriahmetov
Добрый день!

Пишу 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
slav0nic
http://www.sqlalchemy.org/trac/ticket/2581 похоже без raw sql пока нельзя
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB