online_migrations 0.19.6 → 0.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -1
- data/docs/configuring.md +1 -1
- data/lib/generators/online_migrations/templates/background_data_migration.rb.tt +9 -2
- data/lib/online_migrations/background_migrations/migration_job.rb +1 -1
- data/lib/online_migrations/background_migrations/migration_runner.rb +1 -1
- data/lib/online_migrations/background_schema_migrations/migration.rb +2 -2
- data/lib/online_migrations/batch_iterator.rb +2 -1
- data/lib/online_migrations/change_column_type_helpers.rb +2 -2
- data/lib/online_migrations/command_checker.rb +9 -7
- data/lib/online_migrations/database_tasks.rb +1 -1
- data/lib/online_migrations/error_messages.rb +2 -2
- data/lib/online_migrations/schema_statements.rb +2 -2
- 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: 2fd0059b044a120c61044268bfc32c3622163ae1871f85655ae51fe3cfb99c60
|
4
|
+
data.tar.gz: 1e1842002d3d229014011ee2a6af8eb122eaa7a6822912bec2d276f67e6555b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 590aa0a0d36f94316cf02c0b3c8ec2dcf7be08e17cd687eb889d6fb9d8a4cfc892424cffb49c1988691720a7cbede5d58f1a2e712a0ddd8ab8545ce6df6395ed
|
7
|
+
data.tar.gz: a981da87aae5a6e0a5872be04ec9839285fa6b53693c73a4f8ceac354d30f5623d7aef473a8d5c07992e14654083253d3603881f031877692c6718c8f5588407
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
## master (unreleased)
|
2
2
|
|
3
|
+
## 0.20.1 (2024-11-05)
|
4
|
+
|
5
|
+
- Fix background data migrations to work with `includes`/`eager_load` on relation
|
6
|
+
- Fix problem with running migrations for `activerecord` 8.0.0.rc2
|
7
|
+
|
8
|
+
## 0.20.0 (2024-10-21)
|
9
|
+
|
10
|
+
- Enhance columns removal check to check indexes `where` and `include` options
|
11
|
+
- Do not wait before running retried background migrations
|
12
|
+
|
3
13
|
## 0.19.6 (2024-09-26)
|
4
14
|
|
5
|
-
- Fix `
|
15
|
+
- Fix `add_reference_concurrently` when adding non polymorphic references
|
6
16
|
- Fix progress for background migrations with small number of records
|
7
17
|
|
8
18
|
## 0.19.5 (2024-09-20)
|
data/docs/configuring.md
CHANGED
@@ -51,7 +51,7 @@ config.check_down = true
|
|
51
51
|
You can customize specific error messages:
|
52
52
|
|
53
53
|
```ruby
|
54
|
-
config.error_messages[:
|
54
|
+
config.error_messages[:add_column_with_default] = "Your custom instructions"
|
55
55
|
```
|
56
56
|
|
57
57
|
Check the [source code](https://github.com/fatkodima/online_migrations/blob/master/lib/online_migrations/error_messages.rb) for the list of keys.
|
@@ -4,18 +4,25 @@ module <%= migrations_module %>
|
|
4
4
|
<% module_namespacing do -%>
|
5
5
|
class <%= class_name %> < OnlineMigrations::BackgroundMigration
|
6
6
|
def relation
|
7
|
-
# ActiveRecord::Relation to be iterated over
|
7
|
+
# return ActiveRecord::Relation to be iterated over
|
8
8
|
end
|
9
9
|
|
10
10
|
def process_batch(relation)
|
11
|
+
# 'relation' is an ActiveRecord::Relation instance containing a batch to process.
|
12
|
+
#
|
11
13
|
# The work to be done in a single iteration of the background migration.
|
12
14
|
# This should be idempotent, as the same batch may be processed more
|
13
15
|
# than once if the background migration is interrupted and resumed.
|
14
16
|
end
|
15
17
|
|
18
|
+
# Optional.
|
16
19
|
def count
|
17
|
-
#
|
20
|
+
# Define the number of rows that will be iterated over.
|
18
21
|
# This is used to track the background migration's progress.
|
22
|
+
# Usually this is configured to be 'relation.count'.
|
23
|
+
#
|
24
|
+
# If the query to calculate the count is heavy, it is recommended to use
|
25
|
+
# some approximate hardcode number or skip defining this method entirely.
|
19
26
|
end
|
20
27
|
end
|
21
28
|
<% end -%>
|
@@ -17,7 +17,7 @@ module OnlineMigrations
|
|
17
17
|
scope :completed, -> { where(status: [:failed, :succeeded]) }
|
18
18
|
scope :stuck, -> do
|
19
19
|
timeout = OnlineMigrations.config.background_migrations.stuck_jobs_timeout
|
20
|
-
|
20
|
+
running.where("updated_at <= ?", timeout.seconds.ago)
|
21
21
|
end
|
22
22
|
|
23
23
|
scope :retriable, -> do
|
@@ -115,7 +115,7 @@ module OnlineMigrations
|
|
115
115
|
if min_value && max_value
|
116
116
|
create_migration_job!(min_value, max_value)
|
117
117
|
else
|
118
|
-
migration.migration_jobs.retriable.first
|
118
|
+
migration.migration_jobs.enqueued.first || migration.migration_jobs.retriable.first
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
@@ -123,7 +123,7 @@ module OnlineMigrations
|
|
123
123
|
return false if composite?
|
124
124
|
|
125
125
|
stuck_timeout = (statement_timeout || 1.day) + 10.minutes
|
126
|
-
|
126
|
+
running? && updated_at <= stuck_timeout.seconds.ago
|
127
127
|
end
|
128
128
|
|
129
129
|
# Mark this migration as ready to be processed again.
|
@@ -134,7 +134,7 @@ module OnlineMigrations
|
|
134
134
|
if composite? && failed?
|
135
135
|
children.failed.each(&:retry)
|
136
136
|
update!(
|
137
|
-
status: self.class.statuses[:
|
137
|
+
status: self.class.statuses[:enqueued],
|
138
138
|
finished_at: nil
|
139
139
|
)
|
140
140
|
true
|
@@ -19,7 +19,8 @@ module OnlineMigrations
|
|
19
19
|
end
|
20
20
|
|
21
21
|
relation = apply_limits(self.relation, column, start, finish, order)
|
22
|
-
|
22
|
+
unscopes = Utils.ar_version < 7.1 ? [:includes] : [:includes, :preload, :eager_load]
|
23
|
+
base_relation = relation.unscope(*unscopes).reselect(column).reorder(column => order)
|
23
24
|
|
24
25
|
start_id = start || begin
|
25
26
|
start_row = base_relation.uncached { base_relation.first }
|
@@ -118,7 +118,7 @@ module OnlineMigrations
|
|
118
118
|
type_cast_functions[column_name] = type_cast_function if type_cast_function
|
119
119
|
tmp_column_name = conversions[column_name]
|
120
120
|
|
121
|
-
if
|
121
|
+
if database_version >= 11_00_00
|
122
122
|
if primary_key(table_name) == column_name.to_s && old_col.type == :integer
|
123
123
|
# For PG < 11 and Primary Key conversions, setting a column as the PK
|
124
124
|
# converts even check constraints to NOT NULL column constraints
|
@@ -497,7 +497,7 @@ module OnlineMigrations
|
|
497
497
|
def __set_not_null(table_name, column_name)
|
498
498
|
# For PG >= 12 we can "promote" CHECK constraint to NOT NULL constraint:
|
499
499
|
# https://github.com/postgres/postgres/commit/bbb96c3704c041d139181c6601e5bc770e045d26
|
500
|
-
if
|
500
|
+
if database_version >= 12_00_00
|
501
501
|
execute(<<~SQL)
|
502
502
|
ALTER TABLE #{quote_table_name(table_name)}
|
503
503
|
ALTER #{quote_column_name(column_name)}
|
@@ -453,13 +453,7 @@ module OnlineMigrations
|
|
453
453
|
|
454
454
|
if !new_table?(table_name)
|
455
455
|
indexes = connection.indexes(table_name).select do |index|
|
456
|
-
|
457
|
-
when String
|
458
|
-
# Expression index
|
459
|
-
columns.any? { |column| index.columns.include?(column) }
|
460
|
-
else
|
461
|
-
(index.columns & columns).any?
|
462
|
-
end
|
456
|
+
columns.any? { |column| index_include_column?(index, column) }
|
463
457
|
end
|
464
458
|
|
465
459
|
raise_error :remove_column,
|
@@ -892,6 +886,14 @@ module OnlineMigrations
|
|
892
886
|
postgresql_version < Gem::Version.new("14.4")
|
893
887
|
end
|
894
888
|
|
889
|
+
def index_include_column?(index, column)
|
890
|
+
# Expression index
|
891
|
+
(index.columns.is_a?(String) && index.columns.include?(column)) ||
|
892
|
+
index.columns.include?(column) ||
|
893
|
+
(Utils.ar_version >= 7.1 && index.include && index.include.include?(column)) ||
|
894
|
+
(index.where && index.where.include?(column))
|
895
|
+
end
|
896
|
+
|
895
897
|
def run_custom_checks(method, args)
|
896
898
|
OnlineMigrations.config.checks.each do |options, check|
|
897
899
|
if !options[:start_after] || version > options[:start_after]
|
@@ -279,8 +279,8 @@ end",
|
|
279
279
|
|
280
280
|
remove_column:
|
281
281
|
"<% if !small_table && indexes.any? %>
|
282
|
-
Removing a column will automatically remove all
|
283
|
-
|
282
|
+
Removing a column will automatically remove all the indexes that include this column.
|
283
|
+
Indexes will be removed non-concurrently, so you need to safely remove them first:
|
284
284
|
|
285
285
|
class <%= migration_name %>RemoveIndexes < <%= migration_parent %>
|
286
286
|
disable_ddl_transaction!
|
@@ -439,7 +439,7 @@ module OnlineMigrations
|
|
439
439
|
def add_column_with_default(table_name, column_name, type, **options)
|
440
440
|
default = options.fetch(:default)
|
441
441
|
|
442
|
-
if
|
442
|
+
if database_version >= 11_00_00 && !Utils.volatile_default?(self, type, default)
|
443
443
|
add_column(table_name, column_name, type, **options)
|
444
444
|
else
|
445
445
|
__ensure_not_in_transaction!
|
@@ -465,7 +465,7 @@ module OnlineMigrations
|
|
465
465
|
add_not_null_constraint(table_name, column_name, validate: false)
|
466
466
|
validate_not_null_constraint(table_name, column_name)
|
467
467
|
|
468
|
-
if
|
468
|
+
if database_version >= 12_00_00
|
469
469
|
# In PostgreSQL 12+ it is safe to "promote" a CHECK constraint to `NOT NULL` for the column
|
470
470
|
change_column_null(table_name, column_name, false)
|
471
471
|
remove_not_null_constraint(table_name, column_name)
|
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.
|
4
|
+
version: 0.20.1
|
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-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|