Rails不会在测试数据库中重新创建mysql视图,即使在config.active_record.schema_format =:sql时也是如此

Lee*_*Lee 6 ruby mysql migration activerecord ruby-on-rails

我们在开发和测试数据库中有一些mysql视图,这些视图是在迁移过程中通过执行(sql)语句创建的.Rails的默认schema.rb将这些视图创建为表.当config.active_record.schema_format设置为:sql时,根本不会创建这些视图.

是否有设置确保在测试数据库中重新创建这些视图?

如果没有,有人可以建议解决方法吗?

注意,show create table这个视图是这样的:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `sales_reports` AS select ...
Run Code Online (Sandbox Code Playgroud)

并且视图包含在 show tables

经过调查,看起来activerecord故意这样做.

active_record/connection_adapters/mysql_adapter.rb

有这么好的理由吗?

Gar*_*ver 7

请务必阅读本指南的这一部分.

确保在应用程序块中config/application.rb:

config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此Rake任务转储模式,但每当您执行迁移/等时都应该转储/更新它.因为上面的设置:

rake db:structure:dump
Run Code Online (Sandbox Code Playgroud)

你的倾销结构应该在db/structure.sql.它应该看起来像是来自数据库的转储模式文件,即不包括数据,但最后将放置的迁移数据除外(至少对于postgres).

当使用config.active_record.schema_format = :sql您的db/schema.rb更新默认情况下,当你做了迁移,因为db/schema.rb并不意味着是一个完整的模式SQL转储.但是,一些像IntelliJ Rubymine和IDea这样的工具与Ruby文件就像那个文件一样,所以在你的Rakefile中添加这些(如这里提到的):

Rake::Task["db:migrate"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end

Rake::Task["db:rollback"].enhance do
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end
Run Code Online (Sandbox Code Playgroud)

当Rails重新创建测试数据库时,db/structure.sql如果使用它将用作基础config.active_record.schema_format = :sql.如果您在外部回滚或更改数据库并使用上面的命令进行简化或执行迁移等,它也会更新db/structure.sql(并且db/schema.rb上面的那些任务,但db/schema.rb不完全包含来自模式转储的信息).

  • 进行上述更改似乎仍然不会导致 MySQL 视图被写入“structural.sql”;因此它们对测试数据库仍然不可用(在 Rails 3.2.22、ruby 2.3.4p301 中观察到) (2认同)