在单次提交中使用 sqlalchemy 添加和更新

Add and update with sqlalchemy in single commit

我是 sqlalchemy 的新手。我想在单个事务中为下面的相同 model.code 片段添加和更新。应用程序抛出错误 'Session' object has no attribute 'update'

current_date = datetime.datetime.now()
try:
    session = Session()
    user = UserProvision()
    user.username = admin["username"]
    user.password= admin["password"]
    user.client_id= admin["client_id"]
    user.fname= admin["fname"]
    user.lname= admin['lname']
    user.phone= admin['phone']
    session.add(user)
    session.flush()
    user_id = user.user_id
    user.name = admin["fname"]+" "+admin["lname"]
    user.setCreated_by=user_id
    user.setModified_by=user_id
    user.setCreated_name=admin["fname"]+" "+admin["lname"]
    user.setModified_name=admin["fname"]+" "+admin["lname"]
    user.setLast_reset_date=current_date
    user.setLast_reset_by = current_date
    session.update(user)
    session.flush()
    session.commit()
except Exception as ex:
    print ex.__str__()
finally:
    session.close()

当您将模型对象添加到会话中时,它的状态已经被跟踪以进行更改。无需明确将其标记为已更新,正如您所指出的,没有这样的方法 Session.update()。只需删除该行,您的代码就会按预期工作。

通过模型 class 属性的 instrumentation 实现跟踪:

The SQLAlchemy mapping process, among other things, adds database-enabled descriptors to a mapped class which each represent a particular database column or relationship to a related class.

换句话说,当您的模型 class 构建时,Column 属性将替换为 InstrumentedAttribute 描述符实例,这些实例会跟踪值的变化。

请注意,在 Session.commit():

之前不需要手动刷新

Flush pending changes and commit the current transaction.