sqlalchemy REST сериализация - PullRequest
2 голосов
/ 16 ноября 2009

Читая документацию по sqlalchemy, я увидел часть сериализации.
Меня интересует возможность использования сериализатора xml для сопоставления моделей sa с веб-сервисами Rest, такими как Jax-RS
Существует расширение django, которое имеет дело с этим: django_roa
Знаете ли вы, что такого рода вещи уже разработаны для sqlalchemy или возможно ли это сделать ??
Спасибо

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

До полного соответствия RFC2616 долгий путь, но для прототипа я делаю что-то вроде этого:

from sqlalchemy import create_engine, Table, Column, Integer, String, ForeignKey, UniqueConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, backref, sessionmaker
from sqlalchemy.sql.expression import desc
import web
import json

DB_PATH = 'sqlite:////tmp/test.db'

Base = declarative_base()

class LocalClient(Base):
    __tablename__ = 'local_clients'
    __jsonexport__ = ['id', 'name', 'password']

    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True, nullable=False) 
    password = Column(String)

    def __init__(self, name, password):
        self.name = name
        self.password = password

    def __repr__(self):
        return "<LocalClient('%s', '%s')>" % (self.name, self.password)

urls = (
    '/a/LocalClient', 'LocalClientsController'
)

class Encoder(json.JSONEncoder):
    '''This class contains the JSON serializer function for user defined types'''
    def default(self, obj):
        '''This function uses the __jsonexport__ list of relevant attributes to serialize the objects that inherits Base'''
        if isinstance(obj, Base):
            return dict(zip(obj.__jsonexport__, [getattr(obj, v) for v in obj.__jsonexport__]))
        return json.JSONEncoder.default(self, obj)

class LocalClientsController:
    '''The generic RESTful Local Clients Controller'''
    def GET(self):
        '''Returns a JSON list of LocalClients'''
        engine = create_engine(DB_PATH, echo=False)
        Session = sessionmaker(bind=engine)
        session = Session()
        clis = session.query(LocalClient)
        return json.dumps([c for c in clis], cls=Encoder)
1 голос
/ 16 ноября 2009

sqlalchemy.ext.serializer существует для поддержки выбора (с модулем pickle) запросов, выражений и других внутренних объектов SQLAlchemy, он не работает с объектами модели. Это никоим образом не поможет вам сериализовать объекты модели в XML. Возможно, что-то вроде pyxser будет вам полезно.

...