在Ruby on Rails测试中,“数据库已锁定”错误消息是什么意思?

时间:2019-11-14 10:38:40

标签: ruby-on-rails

我正在遵循Hartl的Rails教程并使用Rails6。我不断遇到持续出现的错误,这些错误似乎在每次运行测试时都会随机出现-随机出现是因为连续的测试有时会指示不同区域的错误。这些测试也非常慢-有时> 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

4 个答案:

答案 0 :(得分:0)

这是我面临的挑战之一的解决方案-极慢的测试速度。在config / database.yml中,我向test.sqlite部分添加了以下几行:

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

测试持续时间从几分钟缩短至几秒钟。胜利!

但是,“ RuntimeError:数据库已锁定”消息仍然存在。

答案 1 :(得分:0)

我一直在同一个错误上作斗争。实际上情况非常糟糕,以至于阻碍了我在Hartl的Rails教程中真正前进。

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

请参阅-> https://stackoverflow.com/a/62730905/10463184

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

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

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

答案 2 :(得分:0)

在Windows中,您可以尝试使用该程序http://www.nirsoft.net/utils/opened_files_view.html来确定进程正在处理db文件。尝试关闭该程序以解锁数据库

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

$热熔器development.db

此命令将显示什么进程正在锁定文件:

> development.db:5430

杀死进程...

杀死-9 5430

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

这应该是数据库的内部问题... 对我来说,它已经尝试使用“ SQLite管理器”浏览数据库后显现出来。 因此,如果找不到另一个连接到数据库的进程而又无法修复它,请尝试以下根本解决方案:

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

答案 3 :(得分:0)

我发现自己处于同样的情况。

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

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

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