2016-09-21 128 views
1

這是我第一次嘗試sqlalchemy。我有一個與我的usr信息的JSON文件,我想把它們放在一個sqlite3數據庫文件。它可以工作,但我發現實例的初始化過於冗長,因爲表中有很多列,如下所示。SQLAlchemy實例更簡潔的初始化

是否可以使用字典作爲輸入來初始化User()?像a = User(usr)

import json                
from sqlalchemy import *            
from sqlalchemy.ext.declarative import declarative_base     

engine = create_engine('sqlite:///tutorial.db', echo=True)    

Base = declarative_base()            

class User(Base):              
    __tablename__ = 'users'            

    id = Column(Integer, primary_key=True)        
    bbs_id = Column(String)            
    name = Column(String)            
    sex = Column(String, nullable=False)        
    city = Column(String)            
    state = Column(String)            
    class_type = Column(String, nullable=False)       
    class_id = Column(String, nullable=False)       
    latitude = Column(Float)           
    longitude = Column(Float)           

    def __repr__(self):             
     return "<User(bbs_id='%s', name='%s'>" % (self.bbs_id, self.name) 

Base.metadata.create_all(engine)          


with open('mydata.json') as fin:           
    usrs = json.load(fin)            

usr = usrs[0]               

a = User(id=usr['id'], bbs_id=usr['bbs_id'], name=usr['name']) 

回答

2

如果你知道在JSON對象的屬性名稱匹配的Python模型的列名,你可以改變:

a = User(id=usr['id'], bbs_id=usr['bbs_id'], name=usr['name']) 

到:

a = User(**usr) 

Double-star/dict unpacking每經過一個鍵dict的鍵/值對,就好像它是通過關鍵字傳遞的參數一樣。既然你沒有爲你的模型覆蓋__init__,它已經允許並且期望參數是可選的並且通過關鍵字傳遞,所以這個排列完美。

+0

非常感謝。這正是我想要的! – nos