2013-10-01 83 views
0

我寫了一個使用SQLAlchemy讀取db的所有記錄的小python腳本。這裏是一些代碼將SQLAlchemy輸出轉儲到JSON

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(查詢)引發異常?

此致

回答

1

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 ]) 
+0

請問您能否顯示__dict__方法。我對python真的很陌生? – AndroidDev

+0

@BadLuckBrian編輯。對不起,我有錯誤的超鏈接到SO答案。 –

+0

打印json.dumps([row2dict(row)for query.all()]) row2dict文件「alc-test.py」,第28行, 行中的列.__表__。列: AttributeError:' KeyedTuple'對象沒有屬性'__table__' – AndroidDev

0

我怎麼做的:

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

基本上,給你檢索的對象,搶類實例的字典,除去不能JSON序列的SQLAlchemy的對象和轉換到json。我用燒瓶來做到這一點,但我認爲json.dumps()將工作相同。