轨道不';t在测试数据库中重新创建mysql视图,即使config.active\u record.schema\u format=:sql

轨道不';t在测试数据库中重新创建mysql视图,即使config.active\u record.schema\u format=:sql,mysql,ruby-on-rails,ruby,activerecord,migration,Mysql,Ruby On Rails,Ruby,Activerecord,Migration,我们的开发和测试数据库中有一些mysql视图,它们是在迁移过程中通过execute(sql)语句创建的。Rails的default schema.rb将这些视图创建为表。当config.active_record.schema_format设置为:sql时,根本不会创建这些视图 是否有确保在测试数据库中重新创建这些视图的设置 如果没有,有人能提出解决办法吗 注意,此视图的show create table类似于: CREATE ALGORITHM=UNDEFINED DEFINER=`root`

我们的开发和测试数据库中有一些mysql视图,它们是在迁移过程中通过execute(sql)语句创建的。Rails的default 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 ...
视图包含在
show tables

经过调查,activerecord似乎是故意这样做的

活动\u记录/连接\u适配器/mysql\u adapter.rb

有什么好的理由吗?

一定要这样做

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

config.active_record.schema_format = :sql
然后,您可以使用此Rake任务转储架构,尽管在执行迁移/etc时应该转储/更新该架构。由于上述设置:

rake db:structure:dump
转储的结构应该在
db/structure.sql
中。它应该看起来像数据库中的转储模式文件,即不包括数据,但将放在末尾的迁移数据除外(至少对于postgres)

当使用
config.active\u record.schema\u format=:sql
您的
db/schema.rb
在执行迁移时,默认情况下不会更新,因为
db/schema.rb
并不意味着是完整的架构sql转储。但是,一些工具,如IntelliJ Rubymine和IDea,以及Ruby插件,如该文件所示,在您的Rakefile中添加这些(如前所述):


当Rails重新创建测试数据库时,如果使用
config.active\u record.schema\u format=:sql
,它将使用
DB/structure.sql
作为基础。如果您使用上面的命令或执行migrate等从外部回滚或更改数据库并重新转储,它还将使用上述任务更新
DB/structure.sql
(和
DB/schema.rb
,尽管
DB/schema.rb
不完全包含来自架构转储的信息).

我知道它不能回答您的问题,但我发现gem是一个很好的替代方案…进行上述更改似乎仍然不会导致MySQL视图写入
结构。sql
;因此,它们仍然无法用于测试数据库(使用Rails 3.2.22、ruby 2.3.4p301进行观察)。这个解决方案对我来说很有效:
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