防止 ActiveRecord 迁移对 db/struct.sql 进行巨大更改

问题描述 投票:0回答:1

在测试(不是生产)数据库上运行此 ActiveRecord 迁移时,

db/structure.sql
会出现较大变化。这是可重现的。变化是:

  • 基于迁移代码的少量预期更改(根据需要)。
  • 大量与迁移代码无关的意外更改(不希望出现)。 所有这些意外的更改都会重新排列迁移中 SQL 代码中未提及的表、视图和物化视图的顺序。这些重新排列的项目与迁移中 SQL 代码中的项目关联(例如,通过依赖关系)。

是什么导致了这些巨大的不相关的差异,以及如何防止它们?

它们是否与生产数据库服务器上的 postgresql 版本和在测试数据库上执行迁移的计算机上的 postgresql 版本不匹配有关?

这些不相关的更改使得

git diff

 输出 
much 不太有用。在下面这个最小的示例中,仅重新排列了一些表。但在现实生活中的迁移代码中,它改变了数十个表、视图和 matview 的顺序。

class FixCreateImmuneProductionQualityMetricsViewsWi < ActiveRecord::Migration[5.2] def up sql = <<~SQL DROP VIEW master_foo; DROP VIEW IF EXISTS bar1; CREATE OR REPLACE VIEW bar1 AS SELECT * FROM baz1 UNION ALL SELECT * FROM baz2; CREATE OR REPLACE VIEW master_foo AS SELECT *, 'bar1' AS bar_type FROM bar1 UNION ALL ... SQL execute sql end def down sql = <<~SQL DROP VIEW IF EXISTS master_foo; DROP VIEW IF EXISTS bar1; ... SQL execute sql end end
使用的硬件/软件:

执行迁移的机器:

MacBookPro, Apple M1 Max, macOS Sonoma 14.2.1 ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [arm64-darwin21] 15.3 psql (PostgreSQL) 15.3 (Homebrew)
生产数据库服务器:

psql (14.9 (Homebrew), server 13.3 (Ubuntu 13.3-1.pgdg20.04+1))
    
sql ruby-on-rails ruby postgresql activerecord
1个回答
0
投票
是的,这主要是由于您在不同的机器和/或配置之间使用的数据库引擎版本不同。其他可能的原因是:Rails(Active Record)为了更好的可读性或一致性而进行了内部更改。

请记住,

structure.sql

(或
schema.rb
)文件中表或视图顺序的差异通常不会影响 Rails 应用程序的功能。但要小心,如果您看到其他类型的更改,请仔细检查它们(例如,在 MySQL 中,我看到了 
collationcharset 的更改,这可能会在您的应用程序中导致实际的奇怪问题)。

关于“顺序”,可以通过在迁移中使用

:before

:after
 选项来强制执行。示例:

create_table :my_table, before: :my_other_table
这些选项也适用于列:

add_column :my_table, :my_new_attribute, :integer, after: :my_other_column
    
© www.soinside.com 2019 - 2024. All rights reserved.