sqlalchemy REST 序列化

3 投票
2 回答
2386 浏览
提问于 2025-04-15 16:03

我在看sqlalchemy的文档时,看到有关于序列化的部分。
我在想,是否可以使用xml序列化器来让sqlalchemy模型和像Jax-RS这样的Rest网络服务匹配。
有一个django的扩展可以处理这个问题:django_roa
你知道是否已经为sqlalchemy开发过类似的东西,或者这样做是否可能呢?
谢谢

2 个回答

1

sqlalchemy.ext.serializer 是用来支持将查询、表达式和其他一些 SQLAlchemy 内部对象进行“打包”的,打包是指使用 pickle 模块把这些对象转换成可以存储或传输的格式。不过,它并不处理模型对象。所以,它并不能帮助你把模型对象转换成 XML 格式。如果你想要这样的功能,可能可以试试 pyxser 这个工具。

2

要完全符合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)

撰写回答