【问题标题】:What is the purpose of sqlite_sp_functions in Rails schema.rb?Rails schema.rb 中 sqlite_sp_functions 的用途是什么?
【发布时间】:2014-05-20 08:59:39
【问题描述】:

就像some others,我遇到了错误问题

"ActiveRecord::StatementInvalid: SQLite3::SQLException: 对象名 保留供内部使用: sqlite_sp_functions: CREATE TABLE “sqlite_sp_functions”(“名称”文本,“文本”文本)”

在 Rails 项目上运行 rake test 时。

schema.rb 中的违规行是:

create_table "sqlite_sp_functions", id: false, force: true do |t|
  t.text "name"
  t.text "text"
end

上一个查询中关于此问题的建议涉及编辑schema.rb 或删除该文件并重新生成它,但schema.rb(以及有问题的代码)在每次迁移时都会重新生成(另外,我不想删除 Rails - 在不知道含义的情况下生成代码),因此这并不是一个真正令人满意的解决方案。

那么sqlite_sp_functions 表的用途是什么,如何让 Rails 生成一个不会破坏项目的rake testschema.rb 文件?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    根据https://stackoverflow.com/a/25077833/601782:

    将以下配置行添加到config/application.rbconfig/environments/development.rb

    ActiveRecord::SchemaDumper.ignore_tables = /^sqlite_*/
    

    这将在架构转储期间忽略数据库中所有以“sqlite_”开头的表。

    【讨论】:

      【解决方案2】:

      尝试从schema.rb 中删除有问题的行,然后发出:

      RAILS_ENV=test rake db:reset
      

      这将彻底破坏您的测试数据库,但无论如何您都不应该关心。您不应该为测试环境运行迁移。对于保存数据的环境(例如生产环境,有时是登台/开发环境),迁移是小的(可逆的)步骤。

      处理测试数据库的首选方法是使用db:schema:load 作为测试例程的一部分,这当然会删除所有数据库数据。

      再次提醒:请不要在开发模式下尝试此操作(如果您有手动设置的数据),并且绝对不在生产环境中

      除此之外,您还可以从 SQLite 测试数据库中删除整个 sqlite_sp_functions 表并完全摆脱该问题。我不认为这与 Rails 有任何关系(Rails 也不会产生它)。我相信 SQLite 创建了这个表,你的模式只是把它捡起来(因为它应该)。显然,该表用于保存某种存储过程。

      【讨论】:

      • RAILS_ENV=test rake db:reset 给了我“未知命令“RAILS_ENV”。我不是(有意识地)为我的测试环境运行迁移,而是为我的开发环境运行它们,但是只有一个schema.db,在我运行rake db:migrate 时自动生成(在rails generate scaffold 生成的迁移上),并且rake test(在我生成脚手架时自动创建的测试上)对象。我没有触及测试加载数据的方式(他们从自动生成的固定装置中很好地提取数据)。
      • 你在 Windows 上吗?如果是这样,请尝试set RAILS_ENV=test,然后发出rake db:reset。完成后不要忘记设置环境。
      • 这开始运行我的种子文件,这似乎是错误的(大约需要一个小时),所以我把它杀了。种子文件应该在测试环境中运行吗?无论如何,我已经直接检查了 test.sqlite3 数据库,只有我指定的表(并且它们包含我上次运行的测试的夹具数据),所以数据库重置可能会做任何事情吗?
      • 好吧,如果您使用种子文件,那么您在测试期间也很可能需要它们。如果你想跳过种子阶段rake db:schema:load(如果你需要先rake db:droprake db:create
      • 好的,至少将rake db:drop 作为一个单独的操作执行确认它是受到影响的测试数据库。不幸的是,通过这个过程——删除有问题的行,执行set RAILS_ENV=testrake db:droprake db:createrake db:schema:load,一点都没有好处。在下一次迁移中,Rake/Rails 重新生成了schema.rb,并重新加入了违规行。顺便说一下,我不需要测试用例的种子——他们需要的一切都在 YAML 测试装置中。
      猜你喜欢
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2013-12-21
      • 2023-03-26
      • 2021-04-05
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多