【问题标题】:What does the "database is locked" error message mean in Ruby on Rails testing?Ruby on Rails 测试中的“数据库已锁定”错误消息是什么意思?
【发布时间】:2020-03-10 07:03:06
【问题描述】:

我正在关注 Hartl 的 Rails 教程并使用 Rails 6。每当我运行测试时,我都会不断收到持久性错误,这些错误似乎是随机弹出的 - 随机,因为连续的测试有时会指示不同区域的错误。这些测试也非常非常慢 - 有时 > 30 分钟。有没有人遇到过这个?我可能做错了什么?现在是红鲱鱼:我使用的是 Win 8.1 :)

这些错误消息的共同点是它们都包含“RuntimeErroer:数据库已锁定”消息。这是其中之一:

ERROR["test_email_validation_should_reject_invalid_addresses", 
#<Minitest::Reporters::Suite:0x000000000c9b29c0 @name="UserTest">, 608.7059665989946]
 test_email_validation_should_reject_invalid_addresses#UserTest (608.71s)
RuntimeError: RuntimeError: database is locked

【问题讨论】:

  • 我假设您使用的是 SQLite 数据库?有时 Rails 控制台会锁定数据库,这是 SQLite 数据库的常见问题。尝试在控制台关闭的情况下运行测试
  • 你检查过这些答案了吗stackoverflow.com/questions/7154664/…
  • @nuak,我使用 SQLite 并关闭了 rails 控制台。

标签: ruby-on-rails


【解决方案1】:

很长一段时间以来,我一直在与同样的错误作斗争。它实际上变得如此糟糕,它阻碍了我在 Hartl 的 Rails 教程中真正前进。

编辑:找到了一个更好的答案,它可以简单地解决问题,而不是使用我可能不太了解的设置。

见->https://stackoverflow.com/a/62730905/10463184

我唯一的贡献是,作为 Windows 用户,我发现注释掉 test/test_help.rb 中的整行...

parallelize(workers: :number_of_processors, with: :threads)

解决了这个问题。尝试链接中建议的设置会导致“需要 UNIXServer (LoadError)”错误。

【讨论】:

    【解决方案2】:

    这是我的一个挑战的解决方案 - 测试速度无限慢。在 config/database.yml 我添加(到 test.sqlite 部分)以下行:

      database: db/test.sqlite3
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      timeout: 3000
    

    测试时间从几分钟缩短到几秒钟。胜利!

    但是,“RuntimeError: database is locked”消息仍然存在。

    【讨论】:

      【解决方案3】:

      在windows中你可以试试这个程序http://www.nirsoft.net/utils/opened_files_view.html来找出进程正在处理db文件。尝试关闭该程序以解锁数据库

      在 Linux 和 macOS 中,您可以执行类似的操作,例如,如果您的锁定文件是 development.db:

      $ fuser development.db

      此命令将显示锁定文件的进程:

      > development.db: 5430

      杀死进程...

      杀死 -9 5430

      ...您的数据库将被解锁。

      或者

      应该是数据库内部问题... 对我来说,它在尝试使用“SQLite manager”浏览数据库后表现出来...... 所以,如果你找不到另一个进程连接到数据库并且你无法修复它,试试这个激进的解决方案:

      提供导出表格(您可以在 Firefox 上使用“SQLite 管理器”) 如果迁移改变了您的数据库方案,请删除上次失败的迁移 重命名您的“database.sqlite”文件 执行“rake db:migrate”创建一个新的工作数据库 提供给数据库正确的权限以进行表的导入 导入备份的表 编写新的迁移 使用“rake db:migrate”执行它

      【讨论】:

        【解决方案4】:

        我发现自己处于同样的境地。

        在我的情况下,发生此错误是因为测试在 MiniTest 上默认并行运行,这意味着它们也在 Rails 中并行运行。当发生这种情况并且有测试在测试数据库上进行事务时,数据库会锁定自身导致错误。

        对我有用的解决方案是在测试类中将属性“use_transactional_tests”设置为 false。

        您可以在docs 中查看正确用法和示例。

        【讨论】:

          【解决方案5】:

          如果其他人犯了我所犯的明显错误,请务必退出终端中的任何 Rails 控制台会话,然后再尝试在您的实时站点或测试中删除。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-28
            • 1970-01-01
            • 2012-10-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-28
            • 2011-10-02
            相关资源
            最近更新 更多