Python SQLAlchemy ORM:使用 class 的实例更新行

Python SQLAlchemy ORM: Update row with instance of class

我正在尝试基于 class.

的实例创建一个用于更新数据库中行的函数

基本上我想做这样的事情:

def update_table(self, result):
    session = self.Session()

    session.query(result.__class__).filter_by(id=result.id).update(result)

    session.commit()
    session.close_all()


user = db.Model.User(
  id = 1,
  name = "foo"
)

# Store user to db
db.save(user)

updated_user = db.Model.User(
    id = 1,
    user = "bar"
)

# Update the users name with id=1
update_table(updated_user)

问题是会话查询导致

TypeError: 'User' object is not iterable

但在我看来,这应该以名称="bar".

的更新用户结束

有没有办法使用 SQLAlchemy ORM 创建这样的函数?

您不需要额外的更新程序...

user = db.Model.User(
  id = 1,
  name = "foo"
)

# Store user to db
db.save(user)

new_user = session.query(User).filter(User.id==1).first()
new_user.name = "bar"
session.commit()

我最终得到了这个解决方案:

# Update single entry
def update_table_by_id(self, entry):
    # Open connection to database
    session = self.Session()

    # Fetch entry from database
    db_result = session.query(entry.__class__).filter_by(id=entry.id)

    # Convert Models to dicts
    entry_dict = entry.as_dict()
    db_result_dict = db_result.first().as_dict()

    # Update database result with passed in entry. Skip of None
    for value in entry_dict:
        if entry_dict[value] is not None:
            db_result_dict[value] = entry_dict[value]

    # Update db and close connections
    db_result.update(db_result_dict)
    session.commit()
    session.close_all()

它允许我发送任意模型,并且它们的处理都是一样的。

欢迎提出建议和改进!