在测试(不是生产)数据库上运行此 ActiveRecord 迁移时,
db/structure.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))
请记住,
structure.sql
(或
schema.rb
)文件中表或视图顺序的差异通常不会影响 Rails 应用程序的功能。但要小心,如果您看到其他类型的更改,请仔细检查它们(例如,在 MySQL 中,我看到了collation 或 charset 的更改,这可能会在您的应用程序中导致实际的奇怪问题)。 关于“顺序”,可以通过在迁移中使用
:before
和
:after
选项来强制执行。示例:
create_table :my_table, before: :my_other_table
这些选项也适用于列:
add_column :my_table, :my_new_attribute, :integer, after: :my_other_column