dictのキー名はsqlalchemyオブジェクトattrsにマッピングされています
例:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
id = 3、{name: "diana"}
またはid = 15、{name: "marchel", fullname: "richie marchel"}
から更新できます
setattr()
を使用して、既存のSQLAlchemyオブジェクトの属性を動的に更新できます。
user = session.query(User).get(someid)
for key, value in yourdict.iteritems():
setattr(user, key, value)
ここに別の解決策があります。モデルメソッドを次のように定義すると便利です。
class ModelName(db.Model):
"""
docstring here
"""
...
def update(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
それがあなたの問題を解決することを願っています。
ありがとうございました
ユースケースに応じて(モデルから何かを検証または推論する必要がない場合)、filter_by
をid
とともに使用して特定の行を取得し、それを更新することで、1つのDB呼び出しを保存できます。最初に欲しかったような辞書を使う。
user_query = session.query(User).filter_by(id=someid)
data_to_update = dict(name="marchel", fullname="richie marchel")
user_query.update(data_to_update)
セッションのタイプによっては、synchronize_session=False
キーワード引数をupdate
呼び出しに追加する必要がある場合もあります(scoped_session
を使用する場合):
user_query.update(data_to_update, synchronize_session=False)
@ martijn-pietersの回答に基づいて、setattr
で列を動的に更新するだけでなく、getattr
およびsetattr
と組み合わせて動的テーブルと列を使用することもできます
例:
# models.py
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
# update.py
import models
def dynamic_update(dynamic_table, col_id, dynamic_cols):
"""
dynamic_table: name of the table, "User" for example
col_id: id of which column you want to update
dynamic_cols: key value pairs {name: "diana"}
"""
if hasattr(models, dynamic_table):
table = getattr(models, dynamic_table)
col_info = table.query.filter_by(id=col_id).first()
for (key, value) in dynamic_cols.items():
if hasattr(table, key):
setattr(col_info, key, value)
session.commit()
ところで、setattr
、getattr
、hasattr
に関する詳細情報は、python offical doc https:// docsから入手できます。 .python.org/2/library/functions.html#setattr