ruby 如何在rails中验证schema.rb文件的语法错误?

bt1cpqcv  于 2023-04-20  发布在  Ruby
关注(0)|答案(1)|浏览(88)

我们有两个不同的应用程序,它们都依赖于彼此的数据库来运行测试。
例如,我们在使用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中创建结构时就不会遇到任何问题。

gpnt7bae

gpnt7bae1#

假设你的schema.rb只包含Ruby代码而不是原始SQL,你可以用Rubocop安全地验证它:

rubocop db/schema.rb

或者,使用you can use ruby执行相同的操作:

ruby -c db/schema.rb

然而,你的帖子中有两件事向我表明你可能有原始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:

sqlfluff lint db/structure.sql

或者,您可以在测试套件中集成一个步骤,该步骤使用模式删除和重新创建测试数据库,以确保测试套件在运行时验证模式:

bundle exec rails db:drop db:create db:schema:load db:migrate

您可以在一个或两个应用程序的测试套件中运行此测试,以确保模式按预期工作。
最后,您应该确保对模式的更改只通过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

config.active_record.schema_format = :sql

接下来,使用以下命令转储模式:

bundle exec rails db:schema:dump

如上所述,您可以使用以下命令加载此架构:

bundle exec rails db:schema:load

相关问题