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

SqlAlchemy:插入新行并修改另一个:“无法附加实例<ObjectT>;此会话中已存在另一个具有密钥的实例”

SqlAlchemy是一个Python的ORM(Object Relational Mapping)库,它提供了一种将对象和关系型数据库进行映射的方式,使开发人员可以使用面向对象的方式来操作数据库。

针对你提到的错误信息"无法附加实例<ObjectT>;此会话中已存在另一个具有密钥的实例",该错误通常是因为尝试向数据库中插入一个新的行,但该行与数据库中已存在的行具有相同的主键(或唯一键)导致的。

为了解决这个问题,你可以尝试以下几种方法:

  1. 确保插入的新行具有唯一的主键值,可以通过检查数据库中已有的主键值来避免重复。
  2. 使用SqlAlchemy的merge()方法替代add()方法,merge()方法会在插入新行之前检查数据库中是否已存在相同主键值的行,如果存在则会更新已存在的行。
  3. 使用expire()方法手动将已存在的实例从会话中移除,然后再添加新的实例。例如:
代码语言:txt
复制
session.expire(existing_object)
session.add(new_object)
  1. 检查代码逻辑,确保在添加新行之前,已经正确处理了数据冲突的情况。

以下是SqlAlchemy的一些相关链接和示例代码,供参考:

希望以上信息对你有帮助,如果你还有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(二十五)

在此事件,可以安全地操纵会话状态,即可以附加对象,删除对象,并且可以自由更改对象上单个属性,这些更改将在事件钩子完成时被纳入刷新过程。...populate_existing – 导致该方法无条件地发出 SQL 查询,使用加载数据刷新对象,无论对象是否存在。...Session.merge()检查源实例主键属性,尝试将其与会话具有相同主键实例进行协调。如果在本地找不到,则尝试根据主键从数据库加载对象,如果找不到,则创建一个实例。...populate_existing – 导致该方法无条件地发出 SQL 查询使用加载数据刷新对象,无论对象是否存在。...Session.merge() 检查源实例主键属性,尝试将其与会话具有相同主键实例进行协调。如果在本地找不到,则尝试根据主键从数据库加载对象,如果找不到,则创建一个实例

15410

SqlAlchemy 2.0 中文文档(二十四)

;如果没有可用 RETURNING,则 ORM 目前无法批量选择许多插入。...;如果没有 RETURNING 可用,ORM 目前无法批量选择许多插入。...;如果没有可用 RETURNING,ORM 目前无法批量选择许多插入。...Session.merge() 检查源实例主键属性,尝试将其与会话具有相同主键实例进行协调。如果在本地找不到,它将尝试根据主键从数据库加载对象,如果找不到,则创建一个实例。...Session.merge()检查源实例主键属性,尝试将其与会话具有相同主键实例进行协调。如果在本地找不到,它会尝试根据主键从数据库加载对象,如果找不到任何对象,则创建一个实例

26010
  • SqlAlchemy 2.0 中文文档(二十六)

    警告 此事件在Session发出 SQL 以修改数据库后,但在修改其内部状态以反映这些更改之前运行,包括将插入对象放入标识映射中。...此事件用于在更新发生之前修改实例本地、与对象无关属性,以及在给定连接上发出附加 SQL 语句。 方法将为所有标记为“脏”实例调用,即使它们基于列属性没有净变化。...value – 被附加值。如果监听器以 retval=True 注册,则监听函数必须返回值,或者替换它值。 initiator – 表示事件启动 Event 实例。...此事件用于修改更新后实例仅在 Python 状态,以及在给定连接上发出附加 SQL 语句。...value – 如果对象尚未存在于集合,则将要附加值。 initiator – 代表事件启动Event实例

    16110

    SqlAlchemy 2.0 中文文档(二十二)

    对于暂时(即全新实例,这将在下一次刷新时对这些实例执行插入操作。对于持久(即由此会话加载实例,它们已经存在,不需要添加。...它必须向数据库发出 SQL,获取,然后当它看到主键时,然后它才能查看本地 identity map,查看对象是否存在。...Detached - 一个对应于数据库记录,但目前不在任何会话实例。分离对象将包含一个数据库标识标记,但是由于它没有与会话关联,因此无法确定数据库标识是否实际存在于目标数据库。...) strong_reference_session(maker) ```## 合并 `Session.merge()` 将状态从外部对象传输到会话实例存在实例。...maker = sessionmaker() strong_reference_session(maker) 合并 Session.merge()将外部对象状态转移到会话实例存在实例

    17810

    SqlAlchemy 2.0 中文文档(三)

    在本节,我们将涵盖 Update 和 Delete 构造,用于修改现有以及删除现有。 本节将从核心角度讨论这些构造。...DELETE 语句实例 `Delete`,该语句将从表删除。...自动产生主键属性 一旦插入,我们创建两个 Python 对象处于持久(persistent)状态,它们与它们被添加或加载到Session对象相关联,具有稍后将介绍许多其他行为。...自动生成主键属性 一旦插入,我们创建两个 Python 对象处于一种称为持久性状态,它们与它们所添加或加载Session对象相关联,具有许多其他行为,稍后将进行介绍。...自动生成主键属性 一旦插入,我们创建两个 Python 对象处于所谓 持久化 状态,它们与它们被添加或加载 Session 对象相关联,具有稍后将会介绍许多其他行为。

    27920

    SqlAlchemy 2.0 中文文档(八十)

    添加了“make_transient()”辅助函数,将持久化/分离实例转换为瞬态实例(即删除实例键并从任何会话移除)。...添加了“make_transient()”助手函数,它将一个持久化/分离实例转换为瞬态实例(即删除实例键并从任何会话删除)。...当所有三个标志都设置为默认值时,会话在回滚后能够优雅地恢复,并且很难将过时数据导入会话。详细信息请参阅会话文档。 隐式排序移除。...在许多情况下,推荐使用这种用法,而不是MapperExtension.before_XXX,因为在before_flush(),您可以自由修改会话刷新计划,这是无法从MapperExtension完成...AttributeExtension. - 此类现在是公共 API 一部分,允许拦截属性上用户事件,包括属性设置和删除操作以及集合附加和删除操作。它还允许修改要设置或附加值。

    15610

    SqlAlchemy 2.0 中文文档(二十三)

    由my_parent引用Parent实例,以及所有与该对象相关联且加载(即执行了步骤 2)Child实例,将从Session解除关联。...由my_parent引用Parent实例以及所有与此对象相关联且加载Child实例(即发生了步骤 2)都将从Session解除关联。...然而,即使与删除对象相关可能也被修改,在刷新范围内操作对象上关系绑定集合或对象引用不会发生任何更改。这意味着如果对象是相关集合成员,它将仍然存在于 Python 端,直到该集合过期为止。...在 SQLAlchemy 现代版本,当由 Session.begin_nested() 启动 SAVEPOINT 被回滚时,自 SAVEPOINT 创建以来修改内存对象状态会过期,但自 SAVEPOINT...Connection 上无法安全地修改设置。

    19310

    SqlAlchemy 2.0 中文文档(二十八)

    这个异常真正含义只是与持久对象关联主键标识符对应存在。该行可能已被删除,或在某些情况下,主键更新为值,超出了 ORM 对目标对象管理。...一个对象从其父对象中分离出来,然而该对象以前附加到了另一个父标识,该父标识已被垃圾收集,并且无法确定父标识是否真的是最新“父”。...在 SQLAlchemy 2.0 ,这种行为会自动应用于像 PostgreSQL、SQLite 和 MariaDB 这样使用 RETURNING 在插入行时获取后端。...请注意,“脏”计算是“乐观”;大多数属性设置或集合修改操作都会将实例标记为“脏”,并将其放入集合,即使属性值没有净变化。...请注意,这些结果对象不会像传统Query对象一样自动去重实例。要在 Python 中去重实例,请使用AsyncResult.unique()修改器方法。 版本 1.4 新功能。

    37110

    SqlAlchemy 2.0 中文文档(二十)

    元素首先存在于支持按“分片”扩展,其中对象可以从特定数据库表任意数量副本加载,尽管这些副本具有重叠主键值。...identity_token执行选项可以在每个查询基础上直接影响令牌使用。直接使用它,可以将一个对象多个实例填充到Session,这些实例具有相同主键和源表,但具有不同“标识”。...元素首先存在以支持执行按“sharding”扩展,其中对象可以从特定数据库表任何数量副本中加载,尽管它们具有重叠主键值。...attribute is_mapper = False 如果对象是 Mapper 实例,则为 True。 method label(name) 提供 Bundle 副本传递一个标签。...attribute is_mapper = False 如果对象是 Mapper 实例,则为 True。 method label(name) 提供 Bundle 副本传递一个标签。

    17210

    SqlAlchemy 2.0 中文文档(二十一)

    自版本 2.0 起弃用:逻辑弃用,将在 SQLAlchemy 2.0 删除。请参阅 使用 DISTINCT 与其他列,但仅选择实体 了解 2.0 用例描述。...Query.get() 会检查对象是否存在于标识映射中标记为过期 - 会发出一个 SELECT 来刷新对象确保仍然存在。如果不存在,则会引发 ObjectDeletedError。...这样Query对象,或者已与不同Session关联任何Query对象,可以使用方法生成一个与目标会话关联Query对象: from sqlalchemy.orm import Query query...方法目的是在获取非常大结果集(> 10K )时,将结果批处理到子集合部分地将其产出,以便 Python 解释器不需要声明非常大内存区域,这既费时又导致内存使用过多。...自版本 2.0 起弃用:逻辑弃用,并将在 SQLAlchemy 2.0 删除。请参阅仅选择实体时使用 DISTINCT 添加额外列以获取 2.0 版用例描述。

    27810

    SqlAlchemy 2.0 中文文档(十)

    也就是说,如果一个记录 PtoQ 被映射到“p”和“q”表,其中它基于“p”和“q” LEFT OUTER JOIN 有一,如果进行一个 UPDATE 来修改现有记录“q”表数据,那么“q”必须存在...如果存在,对于大多数支持报告 UPDATE 受影响行数 DBAPI 驱动程序,ORM 将无法检测到更新引发错误;否则,数据将被静默忽略。...如果存在,对于大多数支持报告 UPDATE 受影响行数 DBAPI 驱动程序,ORM 将无法检测到更新引发错误;否则,数据将被静默忽略。...“非主要”映射器概念在许多版本 SQLAlchemy 中一直存在,但自版本 1.3 起,功能已不建议使用。唯一需要非主要映射器情况是在构造与另一个可选择关系时。...另请参见 使用 polymorphic_abstract 构建更深层次层次结构 always_refresh – 如果为 True,则为此映射类所有查询操作将覆盖存在会话对象实例所有数据

    15110

    SqlAlchemy 2.0 中文文档(三十一)

    1.4 版本更改:绝大部分声明式扩展现在整合到 SQLAlchemy ORM ,并可从 sqlalchemy.orm 命名空间导入。请参阅声明式映射文档以获取新文档。...Mypy 插件主要目的是拦截修改 SQLAlchemy 声明性映射 静态定义,使其与它们在被其 Mapper 对象 instrumented 后结构相匹配。...不具有显式类型列 包含 ForeignKey 修改列在 SQLAlchemy 声明性映射中不需要指定数据类型。...method setdefault(*arg) 如果字典没有键,则将键插入并将其值设置为默认值。 如果字典存在键,则返回键值,否则返回默认值。...method setdefault(*arg) 如果键不在字典,则将键插入设置默认值。 如果键在字典,则返回键值,否则返回默认值。

    26120

    【22】进大厂必须掌握面试题-30个Informatica面试

    我们可以有几个选项来处理数据库操作,例如插入,更新,删除。 在会话配置过程,可以使用会话“属性”选项卡“将源视为”设置为所有选择一个数据库操作。 插入:–将所有行都视为插入。...插入:–选择选项可在目标表插入。 删除:–选择选项可从表删除。 更新:-在这种情况下,您有以下选择: 作为更新进行更新:–如果目标表存在每行,则更新标记为要更新。...作为插入更新:–插入标记为更新每一。 更新else插入:–更新该行(如果存在)。否则,将其插入。 截断表:–选择选项可在装入数据之前截断目标表。...这些选项将使会话成为“更新”和“插入”记录,而无需使用“目标表”“更新策略”。 当我们需要用很少记录和更少插入来更新一个巨大表时,我们可以使用解决方案来提高会话性能。...来自路由器New_rec组连接到target1(将两个target实例映射到该实例,一个实例用于rec,另一个实例用于旧rec)。

    6.6K40

    SqlAlchemy 2.0 中文文档(一)

    通过 pip 安装 当 pip 可用时,可以从 PyPI 下载分发包,并在一步安装: pip install SQLAlchemy 命令将从 Python 奶酪商店 下载最新发布版本 SQLAlchemy...通过 pip 安装 当存在pip时,可以从 PyPI 下载分发一步安装: pip install SQLAlchemy 命令将从 Python Cheese Shop 下载最新 发布 版本 SQLAlchemy...我们可以修改我们上面的示例来创建一个表插入一些数据,然后使用Connection.commit()方法在我们获取Connection对象块内调用进行事务提交: # "commit as you go...我们可以修改上面的示例来创建一个表插入一些数据,然后使用Connection.commit()方法来提交事务,在我们获取Connection对象块内调用: # "commit as you go"...()函数生成 SQL INSERT 语句 - 函数生成Insert实例,表示将数据添加到表 INSERT 语句。

    56310

    SqlAlchemy 2.0 中文文档(七十九)

    我们一直有一个长期存在行为,即在刷新期间检查所谓“孤立对象”,即与指定“delete-orphan”级联 relationship() 关联对象,已经被新增到会话中进行插入,并且没有建立父关系...这一功能提供了一个映射器扩展,将基于类功能与特定ScopedSession链接起来,特别是提供了这样行为,即对象实例将自动与该会话关联。...核心异常模块名称已经很久以来是 exc,因此建议导入模块方式是: from sqlalchemy import exc exceptions 名称仍然存在于“sqlalchemy,供可能已经使用...,将基于类功能与特定ScopedSession关联起来,特别是提供了对象实例自动与该会话关联行为。...功能提供了一个映射器扩展,将基于类功能与特定ScopedSession关联起来,特别是提供了对象实例自动与该会话关联行为。

    8610

    SqlAlchemy 2.0 中文文档(三十九)

    一些数据库,如 PostgreSQL,将这个概念进一步扩展为 模式搜索路径,在特定数据库会话可以考虑多个模式名称为“隐式”;引用其中任何一个模式表名都不需要存在模式名称(与此同时,如果模式名称存在...具有数据缓存检查方法在下次调用以获取数据时将发出 SQL 查询。 版本 2.0 新功能。...标志指示列是否具有某种数据库端 “autoincrement” 标志。在 SQLAlchemy ,其他类型列也可以充当 “autoincrement” 列,而不一定在它们身上具有这样标志。...标志指示列是否具有某种数据库端“自动增量”标志。在 SQLAlchemy ,其他类型列也可能充当“自动增量”列,而不一定在其上具有这样标志。...反射局限性 需要注意是,反射过程仅使用在关系数据库中表示信息重建Table元数据。按照定义,过程无法恢复数据库实际未存储模式方面。

    25510

    SqlAlchemy 2.0 中文文档(五十四)

    几乎在所有情况下,表都具有所谓 候选键,这是一列或一系列列,唯一标识一。如果表确实没有这个,且具有实际完全重复,则该表不符合第一范式,无法进行映射。...由于有一些常见编译模式实际上可能会干扰缓存,因此方言维护者必须仔细检查和测试内容,针对任何无法与缓存一起使用旧模式进行调整。...但请记住,如果我们隔离级别是可重复读或更高,则 ORM 无法看到更改,除非我们开始事务。## “会话事务由于在 flush 期间发生先前异常而回滚。”...绝大多数应用程序和用例不会出现无法在其他事务“看到”数据问题,因为它们遵循这种模式,这是短事务最佳实践核心。有关问题一些想法,请参阅我何时构造一个会话,何时提交它,何时关闭它?。...但请记住,如果我们隔离级别是可重复读或更高级别,ORM 无法看到更改,除非我们启动一个事务。 “会话事务由于刷新期间先前异常已被回滚。”

    13310
    领券