Python Sqlachemy的问题。Can';我不明白其中的区别
我有以下代码Python Sqlachemy的问题。Can';我不明白其中的区别,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我有以下代码 def update(project_id, code, description): if project_id is None: raise exception with session_handler() as session: project = session.query(Project).filter_by(project_id=project_id).first() project_upd = sess
def update(project_id, code, description):
if project_id is None:
raise exception
with session_handler() as session:
project = session.query(Project).filter_by(project_id=project_id).first()
project_upd = session.query(Project).filter_by(project_id=project_id)
if project is None:
raise ProjectDoesntExist(f"Project {project_id} does not exist.")
data = _build_update_data(code, description)
if not data:
raise ValueError("No code or description provided")
project_upd.update(data)
因此,如果我将project\u upd.update(data)
替换为project.update(data)
,则会出现以下错误
属性错误:项目对象没有属性更新
如何仅使用一个变量?尽管省略了
项目
模型,但显然它没有方法更新()
——这是标准。区别在于project
绑定到project
对象,而project\u upd
绑定到对象。换句话说,前者表示映射到对象的表中的一行,而后者表示对该表的查询
你的选择是:
session\u handler()
提交。如果不是这样,请根据需要添加显式的会话.commit()
1.单个UPDATE语句
2.获取和更新
在这种情况下,使用
锁定更新可能有点不必要,因为新值似乎不依赖于对象的以前状态。尽管如此,还是要记住这一点。尽管省略了项目
模型,但显然它没有方法更新()
——这是标准。区别在于project
绑定到project
对象,而project\u upd
绑定到对象。换句话说,前者表示映射到对象的表中的一行,而后者表示对该表的查询
你的选择是:
仅发出UPDATE语句并检查它是否与任何行匹配,如果不匹配则引发
获取行/对象,检查它是否存在,如果不存在,则进行更新
如果没有引发异常,我假设session\u handler()
提交。如果不是这样,请根据需要添加显式的会话.commit()
1.单个UPDATE语句
2.获取和更新
在这种情况下,使用锁定更新可能有点不必要,因为新值似乎不依赖于对象的以前状态。不过,这是需要记住的
def update(project_id, code, description):
if project_id is None:
raise exception
data = _build_update_data(code, description)
if not data:
raise ValueError("No code or description provided")
with session_handler() as session:
row_count = session.query(Project).\
filter_by(project_id=project_id).\
update(data)
if not row_count:
raise ProjectDoesntExist(f"Project {project_id} does not exist.")
def update(project_id, code, description):
if project_id is None:
raise exception
data = _build_update_data(code, description)
if not data:
raise ValueError("No code or description provided")
with session_handler() as session:
# Fetch FOR UPDATE so that no concurrent updates may proceed in between
# getting the `Project` instance and actually updating it.
project = session.query(Project).\
filter_by(project_id=project_id).\
with_for_update().\
first()
if project is None:
raise ProjectDoesntExist(f"Project {project_id} does not exist.")
for attr, val in data.items():
setattr(project, attr, val)