SQLAlchemyでのupdate
May 20, 2015 · 1 minute read memopythonSQLAlchemyFlaskweb概要
ノイズのあるdictionaryデータからSQLAlchemyを使って簡単にupdateしたい。
フォームからデータを受け取るとModelに必要のないデータも含まれてしまうことがある。
そういったものをいちいち指定せずによしなにupdateを行えるようにする。
通常のupdateの方法
通常のupdateは次のような感じ。
stmt = Users.update().\
            where(Users.id==5).\
            values(name='user #5')
もしくは
user = Users.query.filter_by(id=5).first()
user.name="hoge"
db.session.commit()
今回の方法
setattr(obj, key, value)を使っていく。
class Users(db.Model):
    id = db.Column(db.Integer, primarykey=True)
    name = db.Column(db.String(100), nullable=False, unique=True)
    password = db.Column(db.String(100), nullable=False)
    def __init__(self, id, name, password):
        self.id = user_id
        self.name = name
        self.password = password
    def update_dict(dict):
        for name, value in dict.items():
            if name in self.__dict__:
                setattr(self, name, value)
# 更新操作
dict = {"name"; hoge, "password":fuga}
user=Users.query.filter_by(id=5).first()
user.update_form(dict)
db.session.commit()
こんな感じのupdate_dictをモデルに実装すると、
dictionaryを無造作に入れても、定義されている値のみが変更され、
データの更新が行われるので楽。
フォームをモデルに合うように作るだけで、データの追加更新を簡単に実装できるようになる。


