我是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()
将模型对象添加到会话后,已跟踪其状态以进行更改。没有必要明确将其标记为已更新,并且正如您已经注意到的那样,没有这样的方法Session.update()
。只需删除该行,您的代码应该按预期工作。
跟踪是通过检测模型类属性来实现的:
SQLAlchemy 映射过程将启用数据库的描述符添加到映射类中,每个描述符表示特定的数据库列或与相关类的关系。
换句话说,在构造模型类时,Column
属性将替换为InstrumentedAttribute
描述符实例,这些描述符实例跟踪值的更改。
请注意,无需在Session.commit()
之前手动刷新:
刷新挂起的更改并提交当前事务。