与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生成一个不会破坏项目schema.rb
的{{1}}文件?
答案 0 :(得分:1)
根据https://stackoverflow.com/a/25077833/601782:
将以下配置行添加到
config/application.rb
或config/environments/development.rb
:ActiveRecord::SchemaDumper.ignore_tables = /^sqlite_*/
这将忽略架构转储期间数据库中以“sqlite_”开头的所有表。
答案 1 :(得分:0)
尝试从schema.rb
删除有问题的行,然后发出:
RAILS_ENV=test rake db:reset
将完全核对您的测试数据库,但您无论如何都不应该关心。您不应该为测试环境运行迁移。对于保存数据的环境(例如生产和有时暂存/开发),迁移意味着是小的(可逆的)步骤。
处理测试数据库的首选方法是使用db:schema:load
作为测试例程的一部分,这当然会删除所有数据库数据。
同样:请不要在开发模式下尝试此操作(如果您有手动设置的数据)并且肯定不在生产中。
除此之外,您可以从SQLite测试数据库中删除整个sqlite_sp_functions
表,并完全消除该问题。我不认为这与Rails有任何关系(Rails也不会产生这种情况)。我相信SQLite创建了这个表,你的架构只是把它拿起来(应该这样)。显然,该表用于保存某种存储过程。