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

在SQLAlchemy中调用delete()后,行仍然存在

在SQLAlchemy中调用delete()方法后,行仍然存在的原因是delete()方法只是生成了一个DELETE语句,但并没有立即执行该语句。这是因为SQLAlchemy采用了延迟执行的策略,即在需要执行操作时才会真正执行数据库操作。

当调用delete()方法后,可以通过调用session.commit()方法来提交事务并执行删除操作。在调用commit()方法之前,可以通过session.query()方法查询被删除的行是否仍然存在。

以下是一个示例代码:

代码语言:txt
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建数据库连接
engine = create_engine('mysql://username:password@localhost/dbname')
Session = sessionmaker(bind=engine)
session = Session()

# 删除行
session.query(User).filter(User.id == 1).delete()

# 提交事务并执行删除操作
session.commit()

# 查询被删除的行是否仍然存在
result = session.query(User).filter(User.id == 1).first()
if result is None:
    print("行已被成功删除")
else:
    print("行仍然存在")

# 关闭数据库连接
session.close()

在上述示例中,我们使用了MySQL数据库和SQLAlchemy库。首先,我们创建了一个数据库连接,并创建了一个会话(session)。然后,我们调用delete()方法删除了id为1的行,并通过commit()方法提交事务并执行删除操作。接着,我们使用query()方法查询id为1的行是否仍然存在,如果查询结果为None,则说明行已被成功删除,否则说明行仍然存在。

需要注意的是,SQLAlchemy中的delete()方法只是生成了一个DELETE语句,但并没有立即执行该语句。因此,在调用delete()方法后,如果不调用commit()方法提交事务并执行删除操作,行仍然会存在于数据库中。

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

相关·内容

SqlAlchemy 2.0 中文文档(二十三)

然而,即使与被删除对象相关的可能也被修改,刷新本身的范围内,涉及操作的关系绑定集合或对象引用上不会发生任何更改。这意味着如果对象是相关集合的成员,则在 Python 端它仍然存在,直到该集合过期。...在下面的例子,我们可以看到,即使将一个 Address 对象标记为删除,刷新,它仍然存在于与父 User 关联的集合: >>> address = user.addresses[1] >>> session.delete...delete级联或将其省略),以便 ORM 或数据库级约束将处理实际修改数据库数据的任务时,ORM 仍然能够适当跟踪可能受影响的本地存在的对象的状态。...然而,即使与已删除对象相关的可能也被修改,刷新范围内操作的对象上的关系绑定集合或对象引用不会发生任何更改。这意味着如果对象是相关集合的成员,它将仍然存在于 Python 端,直到该集合过期为止。...下面,我们说明了将Address对象标记为删除,即使刷新,它仍然存在于与父User关联的集合: >>> address = user.addresses[1] >>> session.delete

19510

SqlAlchemy 2.0 中文文档(五十四)

调用 Session.delete(myobject) ,我的对象未从父集合移除! 加载对象时为什么不调用我的 __init__()?...我如何在 SA 的 ORM 中使用 ON DELETE CASCADE? SQLAlchemy 总是对当前加载 Session 的依赖发出 UPDATE 或 DELETE 语句。...由 flush() 引起的回滚不是完整事务块的结束;虽然它结束了正在进行的数据库事务,Session的视角下仍然存在一个现在处于不活动状态的事务。...Query 去重的问题仍然存在问题,主要原因是 Query.count() 方法不一致,当前状态是,最近的发布,联合急加载首先被“子查询急加载”策略所取代,更近期的是“选择 IN 急加载”策略,这两者通常更适用于集合急加载...SQLAlchemy 总是针对当前加载 Session 的依赖发出 UPDATE 或 DELETE 语句。

15110
  • android onresume函数,android – Activity重新创建调用onResume

    应用程序设置中进行某些更改时,我recreate的onActivityResult调用MainActivity。重新创建,不调用onResume。...我也收到错误:E/ActivityThread: Performing pause of activity that is not resumed 从this问题开始,我了解到不能从onResume调用此函数...另外,使用处理程序来调用recreate可以解决问题,但会导致眨眼,对用户而言很糟糕。这可能是什么错误?没有recreate的情况下如何使用Handler? 任何想法将不胜感激。谢谢!...最佳答案 onResume()之前调用OnActivityResult()。...您可以做的是OnActivityResult()设置一个标志,您可以onResume()检入,如果该标志为true,则可以重新创建活动。

    3.4K20

    SqlAlchemy 2.0 中文文档(十七)

    为了实现这一点,结合使用Insert.values()方法,传递一个将应用于所有的参数字典,以及调用Session.execute()时包含包含单个值的参数字典列表的常规批量调用形式。...在这种情况下,Session 对象的状态不变,不会自动对应于发出的 UPDATE 或 DELETE 语句,如果存在通常与匹配对应的对象。...虽然 SQLAlchemy 尚未拥有与后端无关的 upsert 构造,但上述Insert变体 ORM 兼容方面仍然可用,因为它们可以像文档记录的Insert构造本身一样使用,方法是将要插入的期望嵌入到...虽然 SQLAlchemy 还没有与后端无关的 upsert 构造,但以上的Insert变体仍然与 ORM 兼容,因为它们可以像文档记录的Insert构造本身一样使用,即通过Insert.values...在这种情况下,Session 的对象状态保持不变,并且不会自动与发出的 UPDATE 或 DELETE 语句对应,如果存在通常会与匹配对应的对象。

    30610

    SqlAlchemy 2.0 中文文档(二十六)

    调用此事件时,保证对象存在于会话的标识映射中。 注意 此事件加载程序过程调用,此时可能尚未完成渴望的加载器,并且对象的状态可能不完整。...事件被调用后,原始异常被重新引发,以便对象的构造仍然引发异常。引发的实际异常和堆栈跟踪应该存在于sys.exc_info()。 参数: target – 映射的实例。...这通常发生在基于传入结果创建实例时,并且仅在该实例的生命周期中调用一次。 警告 结果加载期间,当处理此实例接收到的第一时,将调用此事件。...当持久对象的标识刷新从数据库删除时,将调用此事件,但是对象仍然与Session关联,直到事务完成。...这通常发生在基于传入结果创建实例时,并且仅针对该实例的生命周期调用一次。 警告 结果加载期间,当处理此实例的第一接收到时会调用此事件。

    16810

    SqlAlchemy 2.0 中文文档(二十五)

    “顶级”指的是那些select()查询的结果集中表示的Mapper对象,或者update()或delete()查询,是 UPDATE 或 DELETE 的主体。...当下一次刷新操作进行时,对象将移动到 已删除 状态,表示在当前事务为其发出了 DELETE 语句。当事务成功提交时,已删除对象将移动到 分离 状态,并且不再存在于此 Session 。...Session.get()还将执行检查,如果对象存在于标识映射中并标记为过期,则发出 SELECT 以刷新对象以及确保仍然存在。如果不存在,则引发ObjectDeletedError。...下次刷新时,对象将转移到 deleted 状态,表示在当前事务为其发出了DELETE语句。当事务成功提交时,已删除的对象将移至 detached 状态,并不再存在于此Session。...Session.get() 还会检查对象是否存在于标识映射中并标记为过期 - 会发出 SELECT 来刷新对象,并确保仍然存在。如果不是,则引发 ObjectDeletedError。

    15410

    SqlAlchemy 2.0 中文文档(五十六)

    因此,整个移植过程完成,最后一步是针对 SQLAlchemy 2.0 的最新版本进行测试,以纠正可能存在的任何剩余问题。 SQLAlchemy 2.0 的新特性是什么?...这个游标结果必然仍然链接到保持打开事务的 DBAPI 连接,所有这些结果集完全消耗了等待在游标之后释放。... SQLAlchemy 的最初版本,根本不存在 Query 对象。最初的想法是 Mapper 构造本身将能够选择,并且 Table 对象而不是类将用于 Core 风格的方法创建各种条件。...这个游标结果必然仍然链接到保持打开的事务的 DBAPI 连接,所有这些结果集完全消耗了游标中等待的都会被释放。...这个游标结果必然仍然链接到仍然处于打开事务的 DBAPI 连接,所有这些结果集完全消耗了游标中等待的被释放。

    29710

    SqlAlchemy 2.0 中文文档(二十二)

    待刷新的删除之前,被“删除”标记的对象存在于 Session.deleted 集合DELETE ,它们从 Session 删除,该会话事务提交变为永久。...relationship.passive_deletes 参数可用于调整此行为并更自然地依赖于“ON DELETE CASCADE”;当设置为 True 时,此 SELECT 操作将不再发生,但是仍然存在仍将受到显式的...当没有事务存在时,该方法会悄然通过。 使用默认配置的会话,通过自动开始或显式调用Session.begin()方法开始事务,会话的回滚状态如下: 数据库事务被回滚。...挂起的删除被刷新之前,由“delete”标记的对象存在于 Session.deleted 集合。删除之后,它们将从 Session 删除,事务提交,这变得永久。...挂起的删除被刷新之前,“delete”标记的对象存在于Session.deleted集合。删除,它们将从Session移除,事务提交,这将变得永久。

    19210

    SqlAlchemy 2.0 中文文档(三十六)

    对于 DELETE,值是删除的的值。 执行时,要返回的列的值通过结果集可用,并可使用CursorResult.fetchone()等进行迭代。...当用于 DELETE 语句时,默认情况下不会包含任何列 RETURNING ,而是必须明确指定,因为 DELETE 语句执行时通常不会更改值的列。...当存在时,额外的列将包含在 RETURNING 子句中,并且返回时,CursorResult对象将被“倒带”,以便像CursorResult.all()这样的方法将以大部分方式返回新,就好像语句直接使用了...当针对 DELETE 语句使用时,默认情况下不包含任何列 RETURNING ,而必须显式指定,因为 DELETE 语句进行时通常不会更改值的列。...当存在时,额外的列将包含在 RETURNING 子句中,并且返回时 CursorResult 对象将被“倒带”,因此像 CursorResult.all() 这样的方法将返回新的,几乎就像语句直接使用了

    26810

    SqlAlchemy 2.0 中文文档(五十五)

    这条消息是为了处理以下情况而添加的:原始Session关闭,或者调用其Session.expunge_all()方法,迭代可能会产生 ORM 对象的Result对象。...数据库端死锁,例如之间相互死锁 线程错误,例如互相死锁的互斥锁,或者同一线程调用已锁定的互斥锁 请记住,使用池的另一种选择是完全关闭池。请参阅切换池实现部分以了解相关背景信息。...SQLAlchemy Engine 对象默认使用连接池 - 这意味着当一个Engine对象的 SQL 数据库连接资源被使用,并且释放了该资源,数据库连接本身仍然保持连接状态,并返回到一个内部队列,可以再次使用...请注意, SQLAlchemy 2.0 存在绑定元数据的概念。...请注意, SQLAlchemy 2.0 存在绑定元数据的概念。

    32710

    SqlAlchemy 2.0 中文文档(十三)

    当 Query 对象被要求返回完整实体时,将根据主键对条目进行去重,这意味着如果相同的主键值结果中出现多次,则仅存在一个该主键的对象。这不适用于针对个别列的查询。...工作单元 过程只考虑逐行处理对象,这意味着 DELETE 操作意味着集合内的所有必须在刷新过程完全加载到内存。...Select 构造,然后可以进一步修改以选择所需的任何范围,以及使用诸如服务器端游标等功能调用,以便以内存有效的方式迭代通过整个集合。...] (3,) COMMIT 与任何 ORM 映射的集合一样,对象移除可以根据relationship() 的 delete-orphan 配置,要么取消与集合的关联,同时保留对象在数据库存在,要么根据配置发出对其的...工作单元过程仅仅考虑逐行对象,这意味着 DELETE 操作意味着集合的所有必须在刷新过程完全加载到内存

    13010

    SqlAlchemy 2.0 中文文档(二十一)

    first()在生成的 SQL 应用了一个限制为 1,因此仅在服务器端生成一个主要实体(请注意,如果存在联接加载的集合,则可能由多个结果组成)。...Query.get() 会检查对象是否存在于标识映射中并标记为过期 - 会发出一个 SELECT 来刷新对象并确保仍然存在。如果不存在,则会引发 ObjectDeletedError。...当设置为 False 时,返回的查询执行某些操作之前不会断言其状态,包括调用filter()时未应用 LIMIT/OFFSET,调用get()时不存在条件,以及调用filter()/order_by...first()在生成的 SQL 应用了一个限制为一的限制,因此只服务器端生成一个主实体(请注意,如果存在联接加载的集合,则可能由多个结果组成)。...Query.get() 也会检查对象是否存在于标识映射中并标记为过期 - 发出一个 SELECT 来刷新对象以及确保仍然存在。如果不是,ObjectDeletedError 被引发。

    31710

    SqlAlchemy 2.0 中文文档(七十八)

    直到 0.7 版本,这并不是这种情况,应用于InstrumentationEvents的任何事件监听器都将为所有映射的类调用 0.8 ,添加了额外的逻辑,使事件仅对发送的那些类调用。...然而,一些用户仍然感到困惑,因此 0.8 版本我们将其完全删除,以消除任何困惑。... 0.7 版本,情况并非如此,应用于InstrumentationEvents的任何事件监听器都会对所有映射的类调用 0.8 版本,添加了额外的逻辑,使事件只会为那些发送的类调用。...然而,一些用户仍然被困惑,因此 0.8 版本,我们将其完全删除,以消除任何困惑。...然而,一些用户仍然感到困惑,因此 0.8 版本,我们将完全删除它,以消除任何困惑。 #2433

    8010

    SqlAlchemy 2.0 中文文档(十)

    也就是说,如果将记录 PtoQ 映射到“p”和“q”表,其中它基于“p”和“q”的 LEFT OUTER JOIN 的,如果进行更新以更改现有记录“q”表的数据,则“q”必须存在;如果主键标识已经存在...最好同时 INSERT 或 UPDATE 语句中使用 RETURNING 进行获取,否则,如果之后发出 SELECT 语句,则仍然存在潜在的竞争条件,版本计数器可能在获取之前更改。...如果其他地方的事务独立修改了,则此版本 ID 将不再匹配,UPDATE 语句将报告没有匹配的;这是 SQLAlchemy 测试的条件,确保我们的 UPDATE(或 DELETE)语句仅匹配了一。...请注意,调用应用程序可能仍然有其他尚未生成的映射,例如,如果它们尚未导入的模块,还可能有映射尚未配置,如果它们位于当前配置范围之外的其他registry集合。...如果实例的状态已过期,则调用此方法将导致数据库检查以查看对象是否已被删除。如果不再存在,则引发ObjectDeletedError。 此值通常也实例状态下以属性名称键的形式找到。

    15510

    SqlAlchemy 2.0 中文文档(十一)

    为了配置这种行为,使用在 delete 描述的delete级联选项。另一个选项是,当Child对象与其父对象解除关联时,可以将Child对象本身删除。该行为 delete-orphan 描述。...为了配置这种行为,使用 delete 描述的delete级联选项。另一个选项是,当Child对象与其父对象解除关联时,可以删除Child对象本身。这种行为 delete-orphan 描述。...虽然 SQLAlchemy 没有要求,但建议将指向两个实体表的列建立唯一约束或更常见的主键约束;这样可以确保无论应用程序端是否存在问题,表中都不会持续存在重复: association_table...在这里的一个性能较高的选项是使用数据库中使用的外键的 ON DELETE CASCADE 指令。假设数据库支持这个特性,数据库本身可以被设置为“子”的引用被删除时自动删除“次要”表。...这里的一个性能更高的选项是与数据库一起使用 ON DELETE CASCADE 指令。假设数据库支持这个功能,数据库本身可以被设置为“子”的引用被删除时自动删除“辅助”表

    14310

    Python数据库编程

    往数据库里添加新叫做插入(insert),修改表存在叫做更新(update),而移除表存在叫做删除(delete)、这些动作通常称为数据库命令或操作。... users; Query OK, 0 rows affected (0.00 sec)    Python数据库是通过适配器的方式进行访问。...当一个连接建立,可以创建一个游标,向数据库发送请求,然后从数据库接收回应。  ...=cursor,arraysize]) 获取查询结果的下size fetchall() 获取查询结果的剩余所有 __iter__() 为游标创建迭代器对象 messages 游标执行从数据库获得的消息列表...ORM卡发者和数据库之间建立了中间层,把数据库的数据转换成了Python的对象实体,这样即屏蔽不同数据库之间的差异性,又使开发者可以非常方便的操作数据库的数据。

    1.6K20

    SqlAlchemy 2.0 中文文档(十五)

    这指定了两个行都被 INSERTED 之后应使用 UPDATE 语句创建两之间的关联;它还导致发出 DELETE 之前通过 UPDATE 将解除关联。...这指定在两行都被插入使用 UPDATE 语句创建两之间的连接;它还导致发出 DELETE 之前,通过 UPDATE 将彼此解除关联。这个标志应该放在其中一个关系上,最好是多对一的关系。...SQLAlchemy 2.0 的新 PEP 484 特性还利用了属性源代码明确存在而不是使用动态属性生成。...当数据库端存在触发或错误提升方案时,通常会使用此选项。请注意,刷新,会话的子对象上的外键属性不会更改,因此这是一个非常特殊的用例设置。...该标志用于处理两个单独行之间的双向依赖关系(即每行引用另一),否则将无法完全插入或删除两,因为一另一之前存在

    14810
    领券