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

関連する問題