gpt4 book ai didi

mysql - Rails 不会在测试数据库中重新创建 mysql View ,即使 config.active_record.schema_format = :sql

转载 作者:可可西里 更新时间:2023-11-01 06:46:22 24 4
gpt4 key购买 nike

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

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

如果没有,有人可以提出解决方法吗?

注意,此 View 的show create table 类似于:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `sales_reports` AS select ...

并且 View 包含在show tables

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

active_record/connection_adapters/mysql_adapter.rb

这有充分的理由吗?

最佳答案

一定要read this section of the guide .

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

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 和带有 Ruby 插件的 IDea 这样的工具喜欢那个文件,所以在你的 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 - Rails 不会在测试数据库中重新创建 mysql View ,即使 config.active_record.schema_format = :sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com