首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在sqlalchemy事件"after_update“中获取modify列或update语句

在sqlalchemy的"after_update"事件中,可以通过访问event对象来获取修改的列或更新语句。event对象是sqlalchemy.orm.events模块中的一个类,它包含了与事件相关的信息和操作。

要获取修改的列,可以使用event对象的inspect方法来检查被更新的实体对象。通过inspect方法返回的对象,可以使用attrs属性来获取实体对象的属性信息。然后,可以使用attrs属性的get_history方法来获取属性的修改历史。这个方法返回一个元组,其中包含了旧值和新值。

以下是一个示例代码,展示了如何在"after_update"事件中获取修改的列:

代码语言:txt
复制
from sqlalchemy import event

@event.listens_for(YourModel, 'after_update')
def after_update_listener(mapper, connection, target):
    # 获取实体对象的属性信息
    attrs = event.inspect(target).attrs

    # 遍历所有属性
    for attr in attrs:
        # 获取属性的修改历史
        history = attr.get_history(target)

        # 如果属性有修改
        if history.has_changes():
            # 获取旧值和新值
            old_value, new_value = history

            # 在这里可以根据需要进行相应的处理
            print(f"属性 {attr.key} 的旧值为 {old_value},新值为 {new_value}")

关于更新语句的获取,可以通过event对象的connection属性来获取数据库连接对象。然后,可以使用连接对象的execute方法来执行查询语句,从而获取更新语句。

以下是一个示例代码,展示了如何在"after_update"事件中获取更新语句:

代码语言:txt
复制
from sqlalchemy import event

@event.listens_for(YourModel, 'after_update')
def after_update_listener(mapper, connection, target):
    # 获取数据库连接对象
    conn = connection.engine.connect()

    # 执行查询语句获取更新语句
    result = conn.execute(f"SELECT * FROM your_table WHERE id = {target.id}")

    # 遍历查询结果
    for row in result:
        # 获取更新语句
        update_statement = row._update_statement

        # 在这里可以根据需要进行相应的处理
        print(f"更新语句为: {update_statement}")

请注意,以上示例代码仅为演示目的,实际使用时需要根据具体情况进行适当的修改和处理。

推荐的腾讯云相关产品:腾讯云数据库MySQL、腾讯云云服务器(CVM)。

  • 腾讯云数据库MySQL:腾讯云提供的高性能、高可用的云数据库服务,支持MySQL数据库。它具有自动备份、容灾、监控等功能,适用于各种规模的应用场景。了解更多信息,请访问腾讯云数据库MySQL
  • 腾讯云云服务器(CVM):腾讯云提供的弹性计算服务,可以快速创建和管理云服务器实例。它具有高性能、高可靠性和灵活的扩展性,适用于各种计算场景。了解更多信息,请访问腾讯云云服务器(CVM)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(二十六)

此方法对所有标记为“脏”的实例进行调用,甚至对其列基属性没有净变化 的实例,并且没有进行 UPDATE 语句。当任何列基属性的“设置属性”操作被调用或任何集合被修改时,对象被标记为脏。...当对其基于列的属性之一调用“设置属性”操作或修改其任何集合时,对象将被标记为脏。如果在更新时,没有基于列的属性有任何净变化,将不会发出 UPDATE 语句。...这个事件与 InstanceEvents.refresh() 相同,只是在工作单元刷新过程中调用,并且仅包括具有列级默认值或更新处理程序的非主键列,包括 Python 可调用对象以及可能通过 RETURNING...对于所有标记为“脏”的实例都会调用此方法,即使它们的基于列的属性没有任何净变化,并且没有进行 UPDATE 语句。当对象的任何基于列的属性被调用“设置属性”操作或其任何集合被修改时,对象被标记为脏。...当对象的任何基于列的属性被调用“设置属性”操作或其集合被修改时,对象被标记为脏。如果在更新时,没有基于列的属性有任何净变化,那么不会发出 UPDATE 语句。

31210

SqlAlchemy 2.0 中文文档(五十四)

如何配置一个与 Python 保留字或类似的列? 如何在给定映射类的情况下获取所有列、关系、映射属性等的列表?...基于列的属性可以在映射中被赋予任何所需的名称。请参阅明确命名声明式映射的列。 如何在给定一个映射类的情况下获取所有列、关系、映射属性等列表? 所有这些信息都可以从 Mapper 对象中获得。...如何在 ORM 查询中使用文本 SQL? 参见: 从文本语句获取 ORM 结果 - 使用 Query 进行即席文本块。...我如何在 SA 的 ORM 中使用 ON DELETE CASCADE? SQLAlchemy 总是对当前加载在 Session 中的依赖行发出 UPDATE 或 DELETE 语句。...我如何在 SA 的 ORM 中使用 ON DELETE CASCADE? SQLAlchemy 总是针对当前加载在 Session 中的依赖行发出 UPDATE 或 DELETE 语句。

36110
  • SqlAlchemy 2.0 中文文档(七十八)

    #1401 #610 ### 新的类/对象检查系统 许多 SQLAlchemy 用户正在编写需要检查映射类属性的系统,包括能够获取主键列、对象关系、普通属性等等,通常是为了构建数据编组系统,比如 JSON...我们在这个事件上稍微出了点错,因为事件没有提供获取当前用于反射的Inspector和Connection的方法,以防需要来自数据库的额外信息。...#2404 “未使用的列名”警告变成异常 在insert()或update()构造中引用不存在的列将引发错误而不是警告: t1 = table("t1", column("x")) t1.insert(...#2404 “未使用的列名”警告变为异常 在insert()或update()构造中引用不存在的列将引发错误而不是警告: t1 = table("t1", column("x")) t1.insert(...#2404 “未消耗的列名” 警告变为异常 在 insert() 或 update() 构造中引用不存在的列将引发错误而不是警告: t1 = table("t1", column("x")) t1.insert

    15410

    SqlAlchemy 2.0 中文文档(三十三)

    在这个演示中,以下技术被说明: 使用 SessionEvents.do_orm_execute() 事件挂钩 绕过 Session.execute() 的基本技术,从自定义缓存源中获取数据,而不是从数据库中获取...第二次运行演示将利用已经存在的缓存文件,并且仅会发出一条 SQL 语句来查询两个表 - 但是显示的结果将利用数十个懒加载,所有懒加载都从缓存中获取。...关联表包含一个“鉴别器”列,用于确定每个关联表中的行与哪种类型的父对象相关联。 generic_fk.py - 展示了所谓的“通用外键”,类似于流行框架(如 Django、ROR 等)的做法。...关联表包含一个“区分符”列,用于确定哪种类型的父对象与关联表中的每个特定行关联。 generic_fk.py - 演示了所谓的“通用外键”,类似于流行框架(如 Django,ROR 等)的方式。...第二次运行演示将利用已经存在的缓存文件,并且只会发出一条 SQL 语句针对两个表 - 但显示的结果将利用数十个从缓存中获取的延迟加载。

    34610

    SqlAlchemy 2.0 中文文档(四十七)

    事件参考 SQLAlchemy Core 和 SQLAlchemy ORM 都提供了各种各样的事件钩子: 核心事件 - 这些事件在 核心事件 中描述,包括特定于连接池生命周期、SQL 语句执行、事务生命周期和模式创建和拆除的事件钩子...事件参考 SQLAlchemy 核心和 SQLAlchemy ORM 都具有各种各样的事件钩子: 核心事件 - 这些在 核心事件 中描述,包括特定于连接池生命周期、SQL 语句执行、事务生命周期和架构创建和拆除的事件钩子...出现此错误的两种情况如下: 在会话刷新操作中,如果两个对象相互依赖,它们不能仅通过 INSERT 或 DELETE 语句进行插入或删除;需要使用 UPDATE 来后关联或先取消关联其中一个外键约束值。...此属性仅在用户定义的默认生成函数的上下文中可用,例如在 上下文敏感的默认函数 中描述的那样。它由一个字典组成,该字典包含要包含在 INSERT 或 UPDATE 语句中的每个列/值对的条目。...该方法只能在用户定义的默认生成函数的上下文中使用,例如在 上下文敏感的默认函数 中描述的方式。调用时,将返回一个字典,该字典包含 INSERT 或 UPDATE 语句的每个列/值对的条目。

    30610

    SqlAlchemy 2.0 中文文档(三十六)

    使用的方言选择用于填充这些数据的策略;如果是使用服务器端默认值和/或 SQL 表达式生成的,则通常使用特定于方言的方法(如cursor.lastrowid或RETURNING)来获取新的主键值。...当用于 DELETE 语句时,默认情况下不会包含任何列在 RETURNING 中,而是必须明确指定,因为在 DELETE 语句执行时通常不会更改值的列。...参数: cols – 可选的列键名列表或Column,作为过滤器用于将要获取的列。...中的使用示例(ORM 层讨论) 另请参阅 UpdateBase.return_defaults() - 针对高效获取单行 INSERT 或 UPDATE 的服务器端默认值和触发器的替代方法。...正在使用的方言选择用于填充这些数据的策略;如果它是使用服务器端默认值和/或 SQL 表达式生成的,则通常会使用方言特定的方法,如cursor.lastrowid或RETURNING 来获取新的主键值。

    40410

    SqlAlchemy 2.0 中文文档(七十四)

    )以及复合属性(复合列类型)在使用Query.update()时支持在 UPDATE 语句的 SET 子句中使用。...)以及复合属性(复合列类型)在使用Query.update()更新语句的 SET 子句中均得到支持。...)以及复合属性(复合列类型)现在都支持在使用Query.update()时用于 UPDATE 语句的 SET 子句中。...要将对象标记为“已修改”而不指定任何特定属性,以便在自定义事件处理程序(如SessionEvents.before_flush())中考虑到刷新过程中,使用新的flag_dirty()函数: from...要将对象标记为“修改”,而不是特指任何属性,以便考虑到自定义事件处理程序(如SessionEvents.before_flush())的刷新过程中,使用新的flag_dirty()函数: from sqlalchemy.orm

    40710

    SqlAlchemy 2.0 中文文档(二十四)

    数据库是否支持 RETURNING 或等效方法,如“OUTPUT inserted”;这些是在调用 INSERT 或 UPDATE 语句时同时返回服务器生成的值的 SQL 短语。...数据库是否支持 RETURNING 或等效操作,如 “OUTPUT inserted”;这些是 SQL 短语,它们在调用 INSERT 或 UPDATE 语句时同时返回服务器生成的值。...如上所述,对于整数“自动增量”列,以及标记有 Identity 和特殊构造(如 PostgreSQL SERIAL)的列,Core 会自动处理这些类型;数据库包括用于获取“最后插入 id”的函数,在不支持...) VALUES (%s) (b'2018-08-09 13:08:46',) 另请参阅 列插入/更新默认值 关于急切获取用于 INSERT 或 UPDATE 的客户端调用的 SQL 表达式的注意事项...参数: statement – 可执行的语句(即Executable表达式,如select())。 params – 可选的字典,或包含绑定参数值的字典列表。

    41310

    SqlAlchemy 2.0 中文文档(八十)

    之前的 SQLAlchemy 版本会简单地为这些缺失的列插入 NULL。然而,如果上面示例中的 timestamp 列包含 Python 端的默认值或函数,则不会被使用。...一些后端,比如 Oracle,只支持返回单行的 RETURNING - 这包括 UPDATE 和 DELETE 语句,这意味着 update()或 delete()构造必须仅匹配单行,否则会引发错误(由...之前的 SQLAlchemy 版本会简单地为这些缺失的列插入 NULL。然而,在上面的示例中,如果 timestamp 列包含 Python 端默认值或函数,则不会被使用。...之前的 SQLAlchemy 版本会简单地为这些缺失的列插入 NULL。然而,在上面的示例中,如果timestamp列包含 Python 端默认值或函数,则不会被使用。...某些后端,如 Oracle,仅支持返回单行的 RETURNING - 这包括 UPDATE 和 DELETE 语句,意味着 update()或 delete()构造必须仅匹配单行,否则会引发错误(由 Oracle

    20310

    SqlAlchemy 2.0 中文文档(十)

    如果在其他地方的事务独立修改了该行,则此版本 id 将不再匹配,并且 UPDATE 语句将报告没有匹配的行;这是 SQLAlchemy 测试的条件,确保我们的 UPDATE(或 DELETE)语句匹配了恰好一行...最好同时在 INSERT 或 UPDATE 语句中使用 RETURNING 进行获取,否则,如果之后发出 SELECT 语句,则仍然存在潜在的竞争条件,版本计数器可能在获取之前更改。...如果其他地方的事务独立修改了行,则此版本 ID 将不再匹配,UPDATE 语句将报告没有匹配的行;这是 SQLAlchemy 测试的条件,确保我们的 UPDATE(或 DELETE)语句仅匹配了一行。...最好在 INSERT 或 UPDATE 语句中同时进行这个获取,使用 RETURNING,否则,如果之后发出一个 SELECT 语句,那么版本计数器在它被获取之前可能会发生竞争条件。...值的获取可以通过在 INSERT 或 UPDATE 语句中与 RETURNING 一起使用,或者在 INSERT 或 UPDATE 之后添加额外的 SELECT 语句,如果后端不支持 RETURNING

    24810

    SqlAlchemy 2.0 中文文档(二十)

    检查来自启用 ORM 的 SELECT 和 DML 语句的实体和列 select() 构造,以及 insert()、update() 和 delete() 构造(对于后者的 DML 构造,在 SQLAlchemy...1.4.33 中),都支持检查这些语句所针对的实体,以及将在结果集中返回的列和数据类型。...检查启用 ORM 的 SELECT 和 DML 语句中的实体和列 select() 结构以及 insert()、update() 和 delete() 结构(自 SQLAlchemy 1.4.33 起,...从启用 ORM 的 SELECT 和 DML 语句中检查实体和列 select() 构造,以及 insert()、update() 和 delete() 构造(对于后两个 DML 构造,在 SQLAlchemy...SQLAlchemy 1.4.33 中),都支持检查这些语句所针对的实体,以及将在结果集中返回的列和数据类型。

    32610

    SqlAlchemy 2.0 中文文档(十七)

    在 SQLAlchemy 中,选定的后端可能包括特定方言的Insert 构造,这些构造还具有执行“upserts”或将参数集中的现有行转换为近似 UPDATE 语句的能力。...为了调用不使用“按主键的 ORM 批量更新”的 UPDATE 语句,直接使用 Session.connection() 方法对当前事务获取 Connection 执行语句: >>> from sqlalchemy...这意味着当针对多表映射运行 update() 或 delete() 语句时,如连接表继承映射中的子类,该语句必须符合后端当前的功能,这可能包括后端不支持引用多个表的 UPDATE 或 DELETE 语句...这意味着当针对多表映射(如联接表继承映射中的子类)运行update()或delete()语句时,语句必须符合后端的当前能力,这可能包括后端不支持引用多个表的 UPDATE 或 DELETE 语句,或者仅对此提供有限的支持...这意味着当针对多表映射(如联接表继承映射中的子类)运行update()或delete()语句时,语句必须符合后端的当前能力,这可能包括后端不支持引用多个表的 UPDATE 或 DELETE 语句,或者仅对此提供有限的支持

    40410

    SqlAlchemy 2.0 中文文档(二十八)

    导致此情况发生的条件包括: 一个刷新可能已尝试更新或删除行,并且在 UPDATE 或 DELETE 语句期间匹配到了意外数量的行。...请注意,当使用 version_id_col 时,UPDATE 或 DELETE 语句中的行也将与当前已知的版本标识符匹配。...有关完整的行为描述,请参阅同步 SQLAlchemy API 中的Result.scalars()。 参数: index - 整数或行键,指示要从每行提取的列,默认为0,表示第一列。...“同步”运行器中的上述方法与在一个基于事件的编程库(如gevent)上运行 SQLAlchemy 应用程序有一些相似之处。...参考完整的行为描述中的Result.scalars()同步 SQLAlchemy API。 参数: index – 指示要从每行中提取的列的整数或行键,默认为0,表示第一列。

    48510

    SqlAlchemy 2.0 中文文档(二十一)

    然而,这些列 不会 添加到实际由 Query 获取的列列表中,因此不会影响结果。然而,在使用 Query.statement 访问器时,这些列会通过。...当指定了额外的参数时,如 FOR UPDATE NOWAIT 或 LOCK IN SHARE MODE,特定于后端的选项会生效。...然而,这些列不会添加到实际由Query获取的列列表中,因此不会影响结果。但是,在使用Query.statement访问器时,这些列会被传递。...自版本 2.0 起已弃用:此逻辑已弃用,并将在 SQLAlchemy 2.0 中删除。请参阅仅选择实体时使用 DISTINCT 添加额外列以获取 2.0 版中此用例的描述。...当指定其他参数时,后端特定选项,如 FOR UPDATE NOWAIT 或 LOCK IN SHARE MODE 可以生效。

    57410

    SqlAlchemy 2.0 中文文档(七十六)

    executemany() 调用执行,类似于 INSERT 语句可以批处理;这将根据以下标准在刷新中调用: + 两个或更多连续的 UPDATE 语句涉及相同的要修改的列集。...特别是,这些钩子在很大程度上无法使用,因为这些事件中的行为契约与周围内部紧密相关,例如实例如何需要被创建和初始化以及列如何在 ORM 生成的行中定位。...executemany() 调用,类似于 INSERT 语句的批处理;这将根据以下标准在刷新中调用: + 连续两个或更多个 UPDATE 语句涉及相同的要修改的列集。...语句可以批量处理;这将根据以下标准在 flush 中调用: 连续两个或更多的 UPDATE 语句涉及相同的要修改的列集。...特别是,这些钩子在很大程度上无法使用,因为这些事件中的行为契约与周围内部的强烈联系,例如需要如何创建和初始化实例以及如何在 ORM 生成的行中定位列。

    10510

    SqlAlchemy 2.0 中文文档(五十)

    SQLAlchemy 允许通过事件的使用自动发出 PRAGMA 语句以用于新连接: from sqlalchemy.engine import Engine from sqlalchemy import...set_ – 一个字典或其他映射对象,其中键是目标表中的列名称,或者是 Column 对象或其他 ORM 映射的列,匹配目标表的列,值是表达式或文字,指定要采取的 SET 操作。...SQLite 的事务锁定受影响的另一个轴是通过使用的BEGIN语句的性质。这三种类型是“延迟”、“立即”和“独占”,如开始事务所述。...SQLAlchemy 允许通过事件的使用自动发出 PRAGMA 语句以进行新连接: from sqlalchemy.engine import Engine from sqlalchemy import...set_ – 一个字典或其他映射对象,其中键可以是目标表中的列名,或者是 Column 对象或其他 ORM 映射的列,与目标表匹配,以及表达式或字面值作为值,指定要执行的 SET 操作。

    38110
    领券