strong_migrations 0.6.7 → 0.6.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +7 -1
- data/lib/strong_migrations/checker.rb +31 -8
- data/lib/strong_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: f64d60856479de1a9071b64be2186256e619c30a6caea46d2f8094fb1d3ded4b
|
4
|
+
data.tar.gz: 586c15c10b53ba6273685d3d4bbeaa84f0c23fc973643abac1a2687d3ad2e986
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5aac390d0d1f965819311ec4ad0cc18b66eb310768f5ed95635670ca646f8804cf0fb672c94f4f1b59f6d812b027cc2d666607bf9b55d5a5f58f37726056d8c
|
7
|
+
data.tar.gz: f0ec6e96d589aa99df461bbcc29201142a25a74a951edbbdf72c49e8a1d81a58623ccb6f049d2630a5cbd517f9edf9119511087d51da90f95c9794a13f5c1fb1
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -497,11 +497,17 @@ class ValidateSomeColumnNotNull < ActiveRecord::Migration[6.0]
|
|
497
497
|
safety_assured do
|
498
498
|
execute 'ALTER TABLE "users" VALIDATE CONSTRAINT "users_some_column_null"'
|
499
499
|
end
|
500
|
+
|
501
|
+
# in Postgres 12+, you can safely turn this into a traditional column constraint
|
502
|
+
change_column_null :users, :some_column, false
|
503
|
+
safety_assured do
|
504
|
+
execute 'ALTER TABLE "users" DROP CONSTRAINT "users_some_column_null"'
|
505
|
+
end
|
500
506
|
end
|
501
507
|
end
|
502
508
|
```
|
503
509
|
|
504
|
-
Note: This is not 100% the same as `NOT NULL` column constraint. Here’s a [good explanation](https://medium.com/doctolib/adding-a-not-null-constraint-on-pg-faster-with-minimal-locking-38b2c00c4d1c).
|
510
|
+
Note: This is not 100% the same as `NOT NULL` column constraint before Postgres 12. Here’s a [good explanation](https://medium.com/doctolib/adding-a-not-null-constraint-on-pg-faster-with-minimal-locking-38b2c00c4d1c).
|
505
511
|
|
506
512
|
### Keeping non-unique indexes to three columns or less
|
507
513
|
|
@@ -196,12 +196,26 @@ Then add the foreign key in separate migrations."
|
|
196
196
|
table, column, null, default = args
|
197
197
|
if !null
|
198
198
|
if postgresql?
|
199
|
-
|
200
|
-
|
199
|
+
safe = false
|
200
|
+
if postgresql_version >= Gem::Version.new("12")
|
201
|
+
# TODO likely need to quote the column in some situations
|
202
|
+
safe = constraints(table).any? { |c| c["def"] == "CHECK ((#{column} IS NOT NULL))" }
|
203
|
+
end
|
204
|
+
|
205
|
+
unless safe
|
206
|
+
# match https://github.com/nullobject/rein
|
207
|
+
constraint_name = "#{table}_#{column}_null"
|
208
|
+
|
209
|
+
validate_constraint_code = String.new(constraint_str("ALTER TABLE %s VALIDATE CONSTRAINT %s", [table, constraint_name]))
|
210
|
+
if postgresql_version >= Gem::Version.new("12")
|
211
|
+
validate_constraint_code << "\n #{command_str(:change_column_null, [table, column, null])}"
|
212
|
+
validate_constraint_code << "\n #{constraint_str("ALTER TABLE %s DROP CONSTRAINT %s", [table, constraint_name])}"
|
213
|
+
end
|
201
214
|
|
202
|
-
|
203
|
-
|
204
|
-
|
215
|
+
raise_error :change_column_null_postgresql,
|
216
|
+
add_constraint_code: constraint_str("ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s IS NOT NULL) NOT VALID", [table, constraint_name, column]),
|
217
|
+
validate_constraint_code: validate_constraint_code
|
218
|
+
end
|
205
219
|
elsif mysql? || mariadb?
|
206
220
|
raise_error :change_column_null_mysql
|
207
221
|
elsif !default.nil?
|
@@ -255,7 +269,6 @@ Then add the foreign key in separate migrations."
|
|
255
269
|
result
|
256
270
|
end
|
257
271
|
|
258
|
-
# TODO allow string timeouts in 0.7.0
|
259
272
|
def set_timeouts
|
260
273
|
if !@timeouts_set
|
261
274
|
if StrongMigrations.statement_timeout
|
@@ -379,7 +392,7 @@ Then add the foreign key in separate migrations."
|
|
379
392
|
|
380
393
|
# units: https://www.postgresql.org/docs/current/config-setting.html
|
381
394
|
def timeout_to_sec(timeout)
|
382
|
-
|
395
|
+
units = {
|
383
396
|
"us" => 0.001,
|
384
397
|
"ms" => 1,
|
385
398
|
"s" => 1000,
|
@@ -388,7 +401,7 @@ Then add the foreign key in separate migrations."
|
|
388
401
|
"d" => 1000 * 60 * 60 * 24
|
389
402
|
}
|
390
403
|
timeout_ms = timeout.to_i
|
391
|
-
|
404
|
+
units.each do |k, v|
|
392
405
|
if timeout.end_with?(k)
|
393
406
|
timeout_ms *= v
|
394
407
|
break
|
@@ -405,6 +418,16 @@ Then add the foreign key in separate migrations."
|
|
405
418
|
end
|
406
419
|
end
|
407
420
|
|
421
|
+
def constraints(table_name)
|
422
|
+
query = <<-SQL
|
423
|
+
SELECT conname AS name, pg_get_constraintdef(oid) AS def FROM pg_constraint
|
424
|
+
WHERE contype = 'c'
|
425
|
+
AND convalidated
|
426
|
+
AND conrelid = #{connection.quote(connection.quote_table_name(table_name))}::regclass
|
427
|
+
SQL
|
428
|
+
connection.select_all(query.squish).to_a
|
429
|
+
end
|
430
|
+
|
408
431
|
def raise_error(message_key, header: nil, append: nil, **vars)
|
409
432
|
return unless StrongMigrations.check_enabled?(message_key, version: version)
|
410
433
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: strong_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-05-
|
13
|
+
date: 2020-05-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|