online_migrations 0.19.1 → 0.19.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +2 -2
- data/lib/online_migrations/background_migrations/migration_helpers.rb +14 -18
- data/lib/online_migrations/background_migrations/migration_runner.rb +1 -1
- data/lib/online_migrations/schema_statements.rb +26 -7
- data/lib/online_migrations/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d8223e51d4016b3752a738ecbc04cc200c94ee44dd3d91a1be2aefbc74060a9
|
4
|
+
data.tar.gz: bbaa8a04c4b730ac33e1503c59782658f6810f9782b4f882ab2b19bd0e0402d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 878031d1e81e5a069500e4c9c8f0d2bb9b9b60320e07ce101a7ae8680556a6a8114de4d0f6bf092340ec3651f9bbbb74fdc6e6453db39be3c22f6846b5a2ad94
|
7
|
+
data.tar.gz: 143a618f2d46a8a452c9f32ca87f44e47dffe5268bae00dcff008f54865cf272e20bb6aa4af7243cf642a195e64e9aed8269660f1658ebb3440bff12eeed37df
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
## master (unreleased)
|
2
2
|
|
3
|
+
## 0.19.3 (2024-08-09)
|
4
|
+
|
5
|
+
- Fix idempotency for `add_index`/`remove_index` for expression indexes
|
6
|
+
|
7
|
+
## 0.19.2 (2024-07-09)
|
8
|
+
|
9
|
+
- Fix `add_reference_concurrently` to be idempotent when adding a foreign key
|
10
|
+
- Fix `enqueue_background_data_migration` to be idempotent
|
11
|
+
|
3
12
|
## 0.19.1 (2024-05-24)
|
4
13
|
|
5
14
|
- Fix `add_index_in_background` to be idempotent
|
data/README.md
CHANGED
@@ -169,7 +169,7 @@ Config-specific checks:
|
|
169
169
|
|
170
170
|
- [changing the default value of a column](#changing-the-default-value-of-a-column)
|
171
171
|
|
172
|
-
You can also add [custom checks](#custom-checks) or [disable specific checks](#disable-checks).
|
172
|
+
You can also add [custom checks](docs/configuring.md#custom-checks) or [disable specific checks](docs/configuring.md#disable-checks).
|
173
173
|
|
174
174
|
### Removing a column
|
175
175
|
|
@@ -544,7 +544,7 @@ The technique is built on top of database views, using the following steps:
|
|
544
544
|
2. Create a VIEW using the old table name by pointing to the new table name
|
545
545
|
3. Add a workaround for Active Record's schema cache
|
546
546
|
|
547
|
-
For the previous example, to rename `
|
547
|
+
For the previous example, to rename `clients` table to `users`, we can run:
|
548
548
|
|
549
549
|
```sql
|
550
550
|
BEGIN;
|
@@ -440,26 +440,22 @@ module OnlineMigrations
|
|
440
440
|
|
441
441
|
migration_name = migration_name.name if migration_name.is_a?(Class)
|
442
442
|
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
)
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
443
|
+
# Can't use `find_or_create_by` or hash syntax here, because it does not correctly work with json `arguments`.
|
444
|
+
existing_migration = Migration.find_by("migration_name = ? AND arguments = ? AND shard IS NULL", migration_name, arguments.to_json)
|
445
|
+
return existing_migration if existing_migration
|
446
|
+
|
447
|
+
Migration.create!(**options, migration_name: migration_name, arguments: arguments, shard: nil) do |migration|
|
448
|
+
shards = Utils.shard_names(migration.migration_model)
|
449
|
+
if shards.size > 1
|
450
|
+
migration.children = shards.map do |shard|
|
451
|
+
child = migration.dup
|
452
|
+
child.shard = shard
|
453
|
+
child
|
454
|
+
end
|
455
|
+
|
456
|
+
migration.composite = true
|
455
457
|
end
|
456
|
-
|
457
|
-
migration.composite = true
|
458
458
|
end
|
459
|
-
|
460
|
-
# This will save all the records using a transaction.
|
461
|
-
migration.save!
|
462
|
-
migration
|
463
459
|
end
|
464
460
|
end
|
465
461
|
end
|
@@ -13,7 +13,7 @@ module OnlineMigrations
|
|
13
13
|
# Runs one background migration job.
|
14
14
|
def run_migration_job
|
15
15
|
raise "Should not be called on a composite (with sharding) migration" if migration.composite?
|
16
|
-
return if migration.cancelled?
|
16
|
+
return if migration.cancelled? || migration.succeeded?
|
17
17
|
|
18
18
|
mark_as_running if migration.enqueued?
|
19
19
|
migration_payload = notifications_payload(migration)
|
@@ -684,9 +684,17 @@ module OnlineMigrations
|
|
684
684
|
def add_index(table_name, column_name, **options)
|
685
685
|
__ensure_not_in_transaction! if options[:algorithm] == :concurrently
|
686
686
|
|
687
|
-
|
688
|
-
|
689
|
-
|
687
|
+
index =
|
688
|
+
if column_name.is_a?(String) && column_name.match?(/\W/)
|
689
|
+
# Use only name to check if index exists, because it does not work for complex expressions.
|
690
|
+
index_name = (options[:name] || index_name(table_name, column_name)).to_s
|
691
|
+
indexes(table_name).find { |i| i.name == index_name }
|
692
|
+
else
|
693
|
+
# Rewrite this with `IndexDefinition#defined_for?` when Active Record >= 7.1 is supported.
|
694
|
+
# See https://github.com/rails/rails/pull/45160.
|
695
|
+
indexes(table_name).find { |i| __index_defined_for?(i, column_name, **options) }
|
696
|
+
end
|
697
|
+
|
690
698
|
if index
|
691
699
|
schema = __schema_for_table(table_name)
|
692
700
|
|
@@ -729,12 +737,22 @@ module OnlineMigrations
|
|
729
737
|
|
730
738
|
__ensure_not_in_transaction! if options[:algorithm] == :concurrently
|
731
739
|
|
732
|
-
|
740
|
+
column = column_name || options[:column]
|
741
|
+
index_exists =
|
742
|
+
if column.is_a?(String) && column.match?(/\W/)
|
743
|
+
# Use only name to check if index exists, because it does not work for complex expressions.
|
744
|
+
index_name = options[:name] || index_name(table_name, column)
|
745
|
+
index_name_exists?(table_name, index_name)
|
746
|
+
else
|
747
|
+
index_exists?(table_name, column_name, **options)
|
748
|
+
end
|
749
|
+
|
750
|
+
if index_exists
|
733
751
|
if OnlineMigrations.config.statement_timeout
|
734
752
|
# "DROP INDEX CONCURRENTLY" requires a "SHARE UPDATE EXCLUSIVE" lock.
|
735
753
|
# It only conflicts with constraint validations, other creating/removing indexes,
|
736
754
|
# and some "ALTER TABLE"s.
|
737
|
-
super
|
755
|
+
super
|
738
756
|
else
|
739
757
|
OnlineMigrations.deprecator.warn(<<~MSG)
|
740
758
|
Running `remove_index` without a statement timeout is deprecated.
|
@@ -744,7 +762,7 @@ module OnlineMigrations
|
|
744
762
|
MSG
|
745
763
|
|
746
764
|
disable_statement_timeout do
|
747
|
-
super
|
765
|
+
super
|
748
766
|
end
|
749
767
|
end
|
750
768
|
else
|
@@ -773,7 +791,8 @@ module OnlineMigrations
|
|
773
791
|
# @see https://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key
|
774
792
|
#
|
775
793
|
def add_foreign_key(from_table, to_table, **options)
|
776
|
-
|
794
|
+
# Do not consider validation for idempotency.
|
795
|
+
if foreign_key_exists?(from_table, to_table, **options.except(:validate))
|
777
796
|
message = +"Foreign key was not created because it already exists " \
|
778
797
|
"(this can be due to an aborted migration or similar): from_table: #{from_table}, to_table: #{to_table}"
|
779
798
|
message << ", #{options.inspect}" if options.any?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: online_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.19.
|
4
|
+
version: 0.19.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- fatkodima
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|