将SQLAlchemy输出转储为JSON

时间:2013-10-01 07:14:14

标签: python

我编写了一个小的python脚本,它使用SQLAlchemy来读取db的所有记录。这是一些代码

Base=declarative_base()
Session = sessionmaker(bind=engine)
cess=Session()

class Test(Base):
     __tablename__ = 'test'
     my_id = Column(Integer, primary_key=True)
     name = Column(String)
     def __init__(self, id, name):
         self.my_id = id
         self.name = name
     def __repr__(self):
        return "<User('%d','%s')>" % (self.id, self.name)



query= cess.query(Test.my_id, Test.name).order_by(Test.my_id).all()

现在我要将查询对象转换为json字符串。我怎样才能做到这一点 ?使用json.dumps(查询)抛出异常?

亲切的问候

2 个答案:

答案 0 :(得分:3)

json.dumps将根据其conversion table转换对象。

由于您有Test类型的行,因此无法直接序列化这些行。可能最快的方法是将每个返回的行转换为Python dict,然后将其传递给json.dumps

This answer描述了如何将表格行转换为字典。

或者,也许可以直接使用行对象中的_asdict()方法。

query = cess.query(Test.my_id, Test.name).order_by(Test.my_id).all()

json.dumps([ row._asdict() for row in query ])

另一种方法可能是直接在每一行访问__dict__属性,但您应检查输出以确保row.__dict__中没有内部状态变量。

query = cess.query(Test.my_id, Test.name).order_by(Test.my_id).all()

json.dumps([ row.__dict__ for row in query ])

答案 1 :(得分:2)

我是怎么做到的:

fe = SomeClass.query.get(int(1))
fe_dict = fe.__dict__
del fe_dict['_sa_instance_state']
return flask.jsonify(fe_dict)

基本上,给定您检索的对象,获取类实例的dict,删除不能json序列化的sqlalchemy对象并转换为json。我正在使用flask来做这个,但我认为json.dumps()的工作方式是一样的。