我们有两个不同的应用程序,它们都依赖于彼此的数据库来运行测试。
例如,我们在使用App2
-schema.rb
运行App1
中的规范之前创建App2
的DB。
这里的问题是,在使用schema.rb
创建App2
SQL结构的App1
测试中,我们遇到了一些语法问题,如Mysql2::Error: You have an error in your SQL syntax;
。
所以,我在想,在有人更新了App2
之后,有没有办法验证schema.rb
?这样我们在App1
中创建结构时就不会遇到任何问题。
1条答案
按热度按时间gpnt7bae1#
假设你的
schema.rb
只包含Ruby代码而不是原始SQL,你可以用Rubocop安全地验证它:或者,使用you can use
ruby
执行相同的操作:然而,你的帖子中有两件事向我表明你可能有原始SQL:
1.错误
Mysql2::Error: You have an error in your SQL syntax
1.引用“App 2 SQL结构”可能表明您实际上正在转储SQL结构
如果你有raw SQL,那么你可能需要考虑像sqlfluff这样的SQL linter,它可以做与Rubocop相同的事情,但对于raw SQL:
或者,您可以在测试套件中集成一个步骤,该步骤使用模式删除和重新创建测试数据库,以确保测试套件在运行时验证模式:
您可以在一个或两个应用程序的测试套件中运行此测试,以确保模式按预期工作。
最后,您应该确保对模式的更改只通过ActiveRecord迁移进行;不要直接编辑模式文件,并确保它只通过迁移进行更新。
基于以下评论对话的其他建议
如果你的schema稍微有点复杂或者包含 * 任何 * raw SQL或Arel命令,那么使用SQL schema dump选项来生成raw SQL:
当模式格式设置为
:sql
时,数据库结构将使用特定于数据库的工具转储到db/structure.sql
中。例如,对于PostgreSQL,使用pg_dump
实用程序。对于MySQL和MariaDB,此文件将包含SHOW CREATE TABLE
对各种表的输出。这意味着您的模式将在
db/structure.sql
中管理,而不是在db/schema.rb
中管理。首先,将其添加到
config/application.rb
:接下来,使用以下命令转储模式:
如上所述,您可以使用以下命令加载此架构: