如何强制清除 rails SQL 缓存?
How can I force the rails SQL cache to clear?
我 运行 rails db:reset db:migrate
在我的测试脚本(它直接导入模型并直接与模型交互)中的测试之间,但是第一次测试和第二次测试之间没有反映出变化.更具体地说,第一次测试引起的变化没有按应有的方式逆转。
当我从外部(从shell)连接到数据库时,我观察到命令已经生效。
我已经看过 this question 但解决方案没有效果(从字面上看,没有错误,但也没有明显的效果)。
如何强制我的测试脚本清除其内存中的 sqlite 状态缓存?
重现问题的完整步骤。
创建一个新的 rails 应用程序。
rails new MWE
将以下内容放入db/schema.rb
ActiveRecord::Schema.define(version: 20140408213603) do
create_table "users", force: true do |t|
t.string "username"
end
end
将以下内容放入db/seed.rb
.
User.create(username: 'user1')
User.create(username: 'user2')
User.create(username: 'user3')
将以下内容放入 Gemfile
.
source 'https://rubygems.org'
gem 'rails', '4.0.0'
gem 'sqlite3'
gem 'protected_attributes'
将以下内容放入名为 app/models/user.rb
.
的文件中
class User < ActiveRecord::Base
attr_accessible :username
end
运行以下命令。
bundle install
rake db:reset
将以下内容放入名为 MWE.rb
的文件中
load 'config/application.rb'
load 'config/environment.rb'
load 'app/models/user.rb'
# Mimic the unsafe call in the source code
system("bundle exec rake db:reset")
puts User.count
User.destroy_all("username = 'user3'")
puts User.count
system("bundle exec rake db:reset")
puts User.count
User.destroy_all("username = 'user3'")
puts User.count
运行 文件并观察实际输出.
$ ruby MWE.rb
-- create_table("users", {:force=>true})
-> 0.0362s
-- initialize_schema_migrations_table()
-> 0.0248s
3
2
-- create_table("users", {:force=>true})
-> 0.0809s
-- initialize_schema_migrations_table()
-> 0.0490s
2
2
期望的输出
-- create_table("users", {:force=>true})
-> 0.0362s
-- initialize_schema_migrations_table()
-> 0.0248s
3
2
-- create_table("users", {:force=>true})
-> 0.0809s
-- initialize_schema_migrations_table()
-> 0.0490s
3
2
如何强制在模型中反映数据库重置?
您只需重新建立数据库连接即可。尝试:
system("bundle exec rake db:reset")
puts User.count
User.destroy_all("username = 'user3'")
puts User.count
system("bundle exec rake db:reset")
ActiveRecord::Base.clear_all_connections!
puts User.count
User.destroy_all("username = 'user3'")
puts User.count
主要问题是:为什么需要这样做?我很确定有更好的方法可以实现你想要的。
我 运行 rails db:reset db:migrate
在我的测试脚本(它直接导入模型并直接与模型交互)中的测试之间,但是第一次测试和第二次测试之间没有反映出变化.更具体地说,第一次测试引起的变化没有按应有的方式逆转。
当我从外部(从shell)连接到数据库时,我观察到命令已经生效。
我已经看过 this question 但解决方案没有效果(从字面上看,没有错误,但也没有明显的效果)。
如何强制我的测试脚本清除其内存中的 sqlite 状态缓存?
重现问题的完整步骤。
创建一个新的 rails 应用程序。
rails new MWE
将以下内容放入
db/schema.rb
ActiveRecord::Schema.define(version: 20140408213603) do create_table "users", force: true do |t| t.string "username" end end
将以下内容放入
db/seed.rb
.User.create(username: 'user1') User.create(username: 'user2') User.create(username: 'user3')
将以下内容放入
Gemfile
.source 'https://rubygems.org' gem 'rails', '4.0.0' gem 'sqlite3' gem 'protected_attributes'
将以下内容放入名为
的文件中app/models/user.rb
.class User < ActiveRecord::Base attr_accessible :username end
运行以下命令。
bundle install rake db:reset
将以下内容放入名为
的文件中MWE.rb
load 'config/application.rb' load 'config/environment.rb' load 'app/models/user.rb' # Mimic the unsafe call in the source code system("bundle exec rake db:reset") puts User.count User.destroy_all("username = 'user3'") puts User.count system("bundle exec rake db:reset") puts User.count User.destroy_all("username = 'user3'") puts User.count
运行 文件并观察实际输出.
$ ruby MWE.rb -- create_table("users", {:force=>true}) -> 0.0362s -- initialize_schema_migrations_table() -> 0.0248s 3 2 -- create_table("users", {:force=>true}) -> 0.0809s -- initialize_schema_migrations_table() -> 0.0490s 2 2
期望的输出
-- create_table("users", {:force=>true})
-> 0.0362s
-- initialize_schema_migrations_table()
-> 0.0248s
3
2
-- create_table("users", {:force=>true})
-> 0.0809s
-- initialize_schema_migrations_table()
-> 0.0490s
3
2
如何强制在模型中反映数据库重置?
您只需重新建立数据库连接即可。尝试:
system("bundle exec rake db:reset")
puts User.count
User.destroy_all("username = 'user3'")
puts User.count
system("bundle exec rake db:reset")
ActiveRecord::Base.clear_all_connections!
puts User.count
User.destroy_all("username = 'user3'")
puts User.count
主要问题是:为什么需要这样做?我很确定有更好的方法可以实现你想要的。