ec-pg 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ec/pg/migrator.rb +27 -85
- data/lib/ec/pg/version.rb +1 -1
- data/lib/tasks/ec_pg_migrate.rake +8 -39
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 63b59448c98ca14882ddcd20aab8efd9e35c3d970891ca2f97722a539ec31bd1
|
|
4
|
+
data.tar.gz: 592bba1d9afb65ca9ad8b49baa45b217c0f6872e5558abb90a0044e0e8a7b6ea
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 38921ca6212c3e0a5468db148a1b663adccc23c463c8fc12c2b00a497b6696a83109e8b76c2597c947e06afbf1878607beb235532ab2b64157f7497c2d913391
|
|
7
|
+
data.tar.gz: aa7e5b7f89c86a26c0f1171f227fb4a5664a2fc6d381f263c69368a11347acb8c8571da3b1f22baff9322468d34c5a1e0c9c2e58f15fa0061d0bdc3a5c99472a
|
data/lib/ec/pg/migrator.rb
CHANGED
|
@@ -5,116 +5,58 @@ module Ec
|
|
|
5
5
|
# Runs ActiveRecord migrations in the context of a specific schema or shard.
|
|
6
6
|
#
|
|
7
7
|
# == Schema migrations
|
|
8
|
-
#
|
|
9
|
-
# Sets search_path to the target schema before running migrations so that
|
|
10
|
-
# Rails creates (and tracks via schema_migrations) tables inside that schema.
|
|
11
|
-
#
|
|
12
|
-
# Migrator.migrate_schema("tenant_abc")
|
|
13
|
-
# Migrator.migrate_schema("tenant_abc", version: 20240101120000)
|
|
14
|
-
# Migrator.rollback_schema("tenant_abc", steps: 2)
|
|
15
|
-
#
|
|
16
|
-
# Migrator.migrate_each_schema(["tenant_a", "tenant_b"])
|
|
17
|
-
#
|
|
18
|
-
# == Shard migrations
|
|
19
|
-
#
|
|
20
|
-
# Connects to the target shard before running migrations.
|
|
21
|
-
#
|
|
22
|
-
# Migrator.migrate_shard(:shard_one)
|
|
23
|
-
# Migrator.rollback_shard(:shard_one, steps: 1)
|
|
24
|
-
#
|
|
25
|
-
# # Migrate all shards derived from configuration.number_of_shards
|
|
26
|
-
# Migrator.migrate_each_shard
|
|
27
|
-
#
|
|
28
|
-
# # Or supply an explicit list
|
|
29
|
-
# Migrator.migrate_each_shard([:shard_one, :shard_two])
|
|
30
|
-
#
|
|
31
8
|
class Migrator
|
|
32
9
|
class << self
|
|
33
|
-
# Runs pending migrations with search_path set to +schema_name+.
|
|
34
|
-
#
|
|
35
|
-
# @param schema_name [String]
|
|
36
|
-
# @param paths [Array<String>] migration paths (defaults to Rails configured paths)
|
|
37
|
-
# @param version [Integer, nil] target version; migrates to latest when nil
|
|
38
|
-
def migrate_schema(connection, schema_name, paths: nil, version: nil)
|
|
39
|
-
Ec::Pg.dprint("Running migration for: #{schema_name}".red)
|
|
40
|
-
connection.schema_search_path = schema_name
|
|
41
|
-
run_migrations(connection, paths: paths, version: version)
|
|
42
|
-
end
|
|
43
10
|
|
|
11
|
+
# Runs pending migrations on all schemas
|
|
12
|
+
#
|
|
44
13
|
def migrate_all_schemas
|
|
45
14
|
Ec::Pg::SchemaMixin.registered_models.each do |model|
|
|
46
15
|
model.schemas.each do |shard, schemas|
|
|
47
16
|
Ec::Pg.switch(shard: shard) do
|
|
48
|
-
schemas.each do |
|
|
49
|
-
Ec::Pg.dprint("migrating model: #{model}, shard: #{shard}, schema: #{
|
|
50
|
-
|
|
17
|
+
schemas.each do |schema_name|
|
|
18
|
+
Ec::Pg.dprint("migrating model: #{model}, shard: #{shard}, schema: #{schema_name}".red)
|
|
19
|
+
migrate_schema(model.connection, schema_name)
|
|
51
20
|
end
|
|
52
21
|
end
|
|
53
22
|
end
|
|
54
23
|
end
|
|
55
24
|
end
|
|
56
25
|
|
|
57
|
-
#
|
|
26
|
+
# Rollsback schemas
|
|
58
27
|
#
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
SchemaManager.with_schema(schema_name) do
|
|
70
|
-
build_context(paths).rollback(steps)
|
|
28
|
+
def rollback_all_schemas(steps: 1)
|
|
29
|
+
Ec::Pg::SchemaMixin.registered_models.each do |model|
|
|
30
|
+
model.schemas.each do |shard, schemas|
|
|
31
|
+
Ec::Pg.switch(shard: shard) do
|
|
32
|
+
schemas.each do |schema_name|
|
|
33
|
+
Ec::Pg.dprint("rolling back model: #{model}, shard: #{shard}, schema: #{schema_name}".red)
|
|
34
|
+
rollback_schema(model.connection, schema_name, steps)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
71
38
|
end
|
|
72
39
|
end
|
|
73
40
|
|
|
74
|
-
# Runs pending migrations connected to +shard_name+.
|
|
75
|
-
#
|
|
76
|
-
# @param shard_name [Symbol]
|
|
77
|
-
# @param paths [Array<String>]
|
|
78
|
-
# @param version [Integer, nil]
|
|
79
|
-
def migrate_shard(shard_name, paths: nil, version: nil)
|
|
80
|
-
ShardManager.with_shard(shard_name) do
|
|
81
|
-
run_migrations(paths: paths, version: version)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
41
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def migrate_each_shard(shard_names = nil, paths: nil, version: nil)
|
|
91
|
-
(shard_names || default_shards).each do |name|
|
|
92
|
-
migrate_shard(name, paths: paths, version: version)
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def rollback_schema(connection, schema_name, steps)
|
|
45
|
+
with_pool(connection, schema_name) do |pool|
|
|
46
|
+
pool.migration_context.rollback(steps)
|
|
93
47
|
end
|
|
94
48
|
end
|
|
95
49
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
# @param steps [Integer]
|
|
100
|
-
def rollback_shard(shard_name, steps: 1, paths: nil)
|
|
101
|
-
ShardManager.with_shard(shard_name) do
|
|
102
|
-
build_context(paths).rollback(steps)
|
|
50
|
+
def migrate_schema(pool, schema_name)
|
|
51
|
+
with_pool(connection, schema_name) do |pool|
|
|
52
|
+
pool.migration_context.migrate
|
|
103
53
|
end
|
|
104
54
|
end
|
|
105
55
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def run_migrations(connection, paths: nil, version: nil)
|
|
109
|
-
Ec::Pg.dprint("migrations_path: #{paths}")
|
|
110
|
-
|
|
56
|
+
def with_pool(connection, schema_name)
|
|
111
57
|
ActiveRecord::Base.establish_connection(connection.pool.db_config)
|
|
112
|
-
connection.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def default_shards
|
|
116
|
-
n = Ec::Pg.configuration.number_of_shards
|
|
117
|
-
(1..n).map { |i| :"shard_#{i}" }
|
|
58
|
+
connection.schema_search_path = schema_name
|
|
59
|
+
yield(connection.pool)
|
|
118
60
|
end
|
|
119
61
|
end
|
|
120
62
|
end
|
data/lib/ec/pg/version.rb
CHANGED
|
@@ -4,9 +4,9 @@ namespace :ec_pg do
|
|
|
4
4
|
# ---------------------------------------------------------------------------
|
|
5
5
|
# Migrations
|
|
6
6
|
# ---------------------------------------------------------------------------
|
|
7
|
-
namespace :
|
|
7
|
+
namespace :schemas do
|
|
8
8
|
task preload_models: :environment do
|
|
9
|
-
if ENV['
|
|
9
|
+
if ENV['ECPG_DEBUG']
|
|
10
10
|
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -15,46 +15,15 @@ namespace :ec_pg do
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
desc "Migrate
|
|
19
|
-
task :
|
|
20
|
-
name = args[:name] or abort "Usage: rake 'ec_pg:migrate:schema[schema_name]'"
|
|
21
|
-
Ec::Pg::Migrator.migrate_schema(name)
|
|
22
|
-
puts "Schema '#{name}' migrated."
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
desc "Migrate comma-separated schemas. Usage: rake 'ec_pg:migrate:schemas[tenant_a,tenant_b]'"
|
|
26
|
-
task :schemas => :preload_models do
|
|
18
|
+
desc "Migrate all schemas including public."
|
|
19
|
+
task :migrate => :preload_models do
|
|
27
20
|
Ec::Pg::Migrator.migrate_all_schemas
|
|
28
21
|
end
|
|
29
22
|
|
|
30
|
-
desc "
|
|
31
|
-
task :
|
|
32
|
-
|
|
33
|
-
steps
|
|
34
|
-
Ec::Pg::Migrator.rollback_schema(name, steps: steps)
|
|
35
|
-
puts "Rolled back #{steps} migration(s) in schema '#{name}'."
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
desc "Migrate a single shard. Usage: rake 'ec_pg:migrate:shard[shard_one]'"
|
|
39
|
-
task :shard, [:name] => :environment do |_, args|
|
|
40
|
-
name = args[:name] or abort "Usage: rake 'ec_pg:migrate:shard[shard_name]'"
|
|
41
|
-
Ec::Pg::Migrator.migrate_shard(name.to_sym)
|
|
42
|
-
puts "Shard '#{name}' migrated."
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
desc "Migrate all shards (derived from configuration.number_of_shards, or explicit list)"
|
|
46
|
-
task :shards, [:names] => :environment do |_, args|
|
|
47
|
-
shards = args[:names]&.split(",")&.map { |s| s.strip.to_sym }
|
|
48
|
-
Ec::Pg::Migrator.migrate_each_shard(shards)
|
|
49
|
-
puts "All shards migrated."
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
desc "Roll back a shard. Usage: rake 'ec_pg:migrate:rollback_shard[shard_one]' or '[shard_one,2]'"
|
|
53
|
-
task :rollback_shard, [:name, :steps] => :environment do |_, args|
|
|
54
|
-
name = args[:name] or abort "Usage: rake 'ec_pg:migrate:rollback_shard[name]'"
|
|
55
|
-
steps = args[:steps]&.to_i || 1
|
|
56
|
-
Ec::Pg::Migrator.rollback_shard(name.to_sym, steps: steps)
|
|
57
|
-
puts "Rolled back #{steps} migration(s) in shard '#{name}'."
|
|
23
|
+
desc "Rollback all schemas including public. Usage: rake 'ec_pg:schemas:rollback[2]"
|
|
24
|
+
task :rollback, [:steps] => :preload_models do |_, args|
|
|
25
|
+
steps = args[:steps]&.to_i || 1
|
|
26
|
+
Ec::Pg::Migrator.rollback_all_schemas(steps: steps)
|
|
58
27
|
end
|
|
59
28
|
end
|
|
60
29
|
end
|