0

我是 sqlalchemy 的新手。我想在单个事务中为相同的模型添加和更新。代码片段如下。应用程序抛出错误,如“会话”对象没有属性“更新”

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

1 回答 1

2

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

跟踪是通过检测模型类属性来实现的:

除其他外,SQLAlchemy映射过程将启用数据库的描述符添加到映射类,每个映射类表示特定的数据库列或与相关类的关系。

换句话说,当您的模型类被构建时,Column属性将被替换为InstrumentedAttribute描述符实例,其中包括跟踪值的变化。

请注意,无需在之前手动刷新Session.commit()

刷新挂起的更改并提交当前事务。

于 2017-11-03T07:46:09.433 回答