2016-09-21 93 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