Class: Ec::Pg::Migrator

Inherits:
Object
  • Object
show all
Defined in:
lib/ec/pg/migrator.rb

Overview

Runs ActiveRecord migrations in the context of a specific schema or shard.

Schema migrations

Sets search_path to the target schema before running migrations so that Rails creates (and tracks via schema_migrations) tables inside that schema.

Migrator.migrate_schema("tenant_abc")
Migrator.migrate_schema("tenant_abc", version: 20240101120000)
Migrator.rollback_schema("tenant_abc", steps: 2)

Migrator.migrate_each_schema(["tenant_a", "tenant_b"])

Shard migrations

Connects to the target shard before running migrations.

Migrator.migrate_shard(:shard_one)
Migrator.rollback_shard(:shard_one, steps: 1)

# Migrate all shards derived from configuration.number_of_shards
Migrator.migrate_each_shard

# Or supply an explicit list
Migrator.migrate_each_shard([:shard_one, :shard_two])

Class Method Summary collapse

Class Method Details

.migrate_all_schemasObject



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/ec/pg/migrator.rb', line 44

def migrate_all_schemas 
  Ec::Pg::SchemaMixin.registered_models.each do |model|
    model.schemas.each do |shard, schemas|
      Ec::Pg.switch(shard: shard) do 
        schemas.each do |schema|
          Ec::Pg.dprint("migrating model: #{model}, shard: #{shard}, schema: #{schema}")
            migrate_schema(model.connection, schema)
        end
      end
    end
  end
end

.migrate_each_schema(connection, schema_names, paths: nil, version: nil) ⇒ Object

Calls migrate_schema for each name in schema_names.

Parameters:

  • schema_names (Array<String>)


60
61
62
# File 'lib/ec/pg/migrator.rb', line 60

def migrate_each_schema(connection, schema_names, paths: nil, version: nil)
  schema_names.each { |name| migrate_schema(connection, name, paths: paths, version: version) }
end

.migrate_each_shard(shard_names = nil, paths: nil, version: nil) ⇒ Object

Calls migrate_shard for each name in shard_names. When shard_names is omitted, derives :shard_1 through :shard_N from configuration.number_of_shards.

Parameters:

  • shard_names (Array<Symbol>, nil) (defaults to: nil)


90
91
92
93
94
# File 'lib/ec/pg/migrator.rb', line 90

def migrate_each_shard(shard_names = nil, paths: nil, version: nil)
  (shard_names || default_shards).each do |name|
    migrate_shard(name, paths: paths, version: version)
  end
end

.migrate_schema(connection, schema_name, paths: nil, version: nil) ⇒ Object

Runs pending migrations with search_path set to schema_name.

Parameters:

  • schema_name (String)
  • paths (Array<String>) (defaults to: nil)

    migration paths (defaults to Rails configured paths)

  • version (Integer, nil) (defaults to: nil)

    target version; migrates to latest when nil



38
39
40
41
42
# File 'lib/ec/pg/migrator.rb', line 38

def migrate_schema(connection, schema_name, paths: nil, version: nil)
  Ec::Pg.dprint("Running migration for: #{schema_name}".red)
  connection.schema_search_path = schema_name
  run_migrations(connection, paths: paths, version: version)
end

.migrate_shard(shard_name, paths: nil, version: nil) ⇒ Object

Runs pending migrations connected to shard_name.

Parameters:

  • shard_name (Symbol)
  • paths (Array<String>) (defaults to: nil)
  • version (Integer, nil) (defaults to: nil)


79
80
81
82
83
# File 'lib/ec/pg/migrator.rb', line 79

def migrate_shard(shard_name, paths: nil, version: nil)
  ShardManager.with_shard(shard_name) do
    run_migrations(paths: paths, version: version)
  end
end

.rollback_schema(schema_name, steps: 1, paths: nil) ⇒ Object

Rolls back steps migrations with search_path set to schema_name.

Parameters:

  • schema_name (String)
  • steps (Integer) (defaults to: 1)

    number of migrations to roll back (default 1)



68
69
70
71
72
# File 'lib/ec/pg/migrator.rb', line 68

def rollback_schema(schema_name, steps: 1, paths: nil)
  SchemaManager.with_schema(schema_name) do
    build_context(paths).rollback(steps)
  end
end

.rollback_shard(shard_name, steps: 1, paths: nil) ⇒ Object

Rolls back steps migrations connected to shard_name.

Parameters:

  • shard_name (Symbol)
  • steps (Integer) (defaults to: 1)


100
101
102
103
104
# File 'lib/ec/pg/migrator.rb', line 100

def rollback_shard(shard_name, steps: 1, paths: nil)
  ShardManager.with_shard(shard_name) do
    build_context(paths).rollback(steps)
  end
end