我编写了一个小的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(查询)抛出异常?
亲切的问候
答案 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()的工作方式是一样的。