web-dev-qa-db-ja.com

python dictによってsqlalchemy ormオブジェクトを更新する方法

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"}から更新できます

26
chao787

setattr()を使用して、既存のSQLAlchemyオブジェクトの属性を動的に更新できます。

user = session.query(User).get(someid)

for key, value in yourdict.iteritems():
    setattr(user, key, value)
33
Martijn Pieters

ここに別の解決策があります。モデルメソッドを次のように定義すると便利です。

class ModelName(db.Model):
    """
    docstring here
    """
    ...

    def update(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

それがあなたの問題を解決することを願っています。

ありがとうございました

5
Perfect

ユースケースに応じて(モデルから何かを検証または推論する必要がない場合)、filter_byidとともに使用して特定の行を取得し、それを更新することで、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)
4
sheba

@ 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()

ところで、setattrgetattrhasattrに関する詳細情報は、python offical doc https:// docsから入手できます。 .python.org/2/library/functions.html#setattr

https://docs.python.org/2/library/functions.html#getattr

https://docs.python.org/2/library/functions.html#hasattr

3
vinian