【问题标题】:Rails doesn't recreate mysql views in the test database, even when config.active_record.schema_format = :sqlRails 不会在测试数据库中重新创建 mysql 视图,即使 config.active_record.schema_format = :sql
【发布时间】:2010-12-20 04:09:30
【问题描述】:

我们的开发和测试数据库中有一些 mysql 视图,这些视图是通过迁移中的 execute(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 ...

并且视图包含在show tables

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

active_record/connection_adapters/mysql_adapter.rb

这样做有充分的理由吗?

【问题讨论】:

  • 我知道它不能回答你的问题,但我发现 sql views gem 是一个不错的选择......

标签: mysql ruby-on-rails ruby activerecord migration


【解决方案1】:

请务必read this section of the guide

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

config.active_record.schema_format = :sql

然后您可以使用此 Rake 任务来转储架构,但在您执行迁移/等操作时应该转储/更新它。由于上面的设置:

rake db:structure:dump

您的转储结构应位于db/structure.sql。它应该看起来像您的数据库中的转储模式文件,即不包括数据,除了将放在最后的迁移数据(至少对于 postgres)。

使用config.active_record.schema_format = :sql 时,您的db/schema.rb 默认情况下不会在您进行迁移时更新,因为db/schema.rb 并不意味着是完整的架构SQL 转储。但是,像 IntelliJ Rubymine 和 IDea 等带有 Ruby 插件的工具会出现该文件,因此在您的 Rakefile 中添加这些(如提到的here):

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

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

【讨论】:

  • 进行上述更改似乎仍然不会导致 MySQL 视图被写入structure.sql;因此它们对测试数据库仍然不可用(使用 Rails 3.2.22、ruby 2.3.4p301 观察)
  • 这个解决方案对我有用:weavingcode.blogspot.com/2011/12/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多