如何通过python dict更新sqlalchemy orm对象

时间:2014-04-18 10:34:55

标签: python orm sqlalchemy

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"}

进行更新

6 个答案:

答案 0 :(得分:31)

您可以使用setattr()动态更新现有SQLAlchemy对象的属性:

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

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

答案 1 :(得分:5)

我在这里有另一个解决方案。将模型方法定义如下是很方便的。

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

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

我希望它能解决你的问题。

谢谢

答案 2 :(得分:4)

根据您的用例(如果您不需要验证或推断模型中的任何内容),可以通过将filter_byid一起使用来保存一个数据库调用,以获取特定的行,并使用您最初想要的字典来更新它。

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)

答案 3 :(得分:3)

根据@ martijn-pieters的回答, 您不仅可以使用setattr动态更新列,还可以将动态表和列与getattrsetattr结合使用

示例:

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

BTW,您可以从python官方文档中获取有关setattrgetattrhasattr的更多信息 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

答案 4 :(得分:0)

我认为最简单的方法是使用带有 update 的 sqlalchemy filter

def update_item(db: Session, item_id: int, item: ItemUpdate):
    db.query(Item).filter(id=item_id).update(item.dict())
    db.commit()

确保您始终对主键进行过滤,以避免更新多于一行。这可以作为在提交会话之前检查代码来完成。

答案 5 :(得分:0)

在 sqlalchemy 2.0 API 中,您可以使用:

stmt = update(User).where(User.name == "john").values(**your_data)
session.execute(stmt)