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
绑定到对象。换句话说,前者表示映射到对象的表中的一行,而后者表示对该表的查询

你的选择是:

  • 仅发出UPDATE语句并检查它是否与任何行匹配,如果不匹配则引发
  • 获取行/对象,检查它是否存在,如果不存在,则进行更新
  • 如果没有引发异常,我假设
    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)