【问题标题】:Laravel truncating table causing error during testLaravel 截断表在测试期间导致错误
【发布时间】:2021-06-24 09:31:35
【问题描述】:

我正在尝试截断一个表,但每次我尝试通过测试运行它时都会收到 PDOException: There is no active transaction

我正在使用 RefreshDatabase 特征。

我的代码如下所示:

Model::query()->truncate();

【问题讨论】:

  • 模型::truncate()
  • 如果特征已经为你做了,你为什么要截断?
  • @matiaslauriti 我有实际的逻辑截断,我正在尝试测试
  • 出于好奇,您为什么要截断实时代码中的表格?为什么需要这样做?

标签: laravel phpunit laravel-sail


【解决方案1】:

错误是由truncate 操作引起的

基于https://stackoverflow.com/a/1522974/6644975上的回答

当您执行 truncate 语句时,事务被提交,然后 TRUNCATE 被执行且无法撤消。

这会影响RefreshDatabase trait,它为每个测试使用一个事务。

这是它的运行方式

  1. RefreshDatabase 创建交易
  2. 你在这里对数据库做一些事情
  3. 你执行truncate
  4. Truncate 提交事务
  5. RefreshDatabase 尝试提交事务但无法提交,因为它已经提交导致错误 There is no active transaction

【讨论】:

  • 感谢您的回答,这是有道理的。那么如果 truncate 不是一个好的测试解决方案,如何实现替换数据库中的所有记录。
  • @Ezrab_ 您是否使用截断来重置递增 ID?如果不是,您可以使用 DB::table('table_name')->delete(); 删除数据库中的所有记录。
  • 我们如何防止这种情况发生?我还需要重置自动增量
【解决方案2】:

尝试使用特征DatabaseMigrations 而不是RefreshDatabase

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2020-04-27
    • 2017-08-02
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多