Class: Lhm::Migrator
- Inherits:
-
Object
- Object
- Lhm::Migrator
- Defined in:
- lib/lhm/migrator.rb
Overview
Copies existing schema and applies changes using alter on the empty table. ‘run` returns a Migration which can be used for the remaining process.
Instance Attribute Summary collapse
-
#conditions ⇒ Object
readonly
Returns the value of attribute conditions.
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#origin ⇒ Object
readonly
Returns the value of attribute origin.
-
#renames ⇒ Object
readonly
Returns the value of attribute renames.
-
#statements ⇒ Object
readonly
Returns the value of attribute statements.
Instance Method Summary collapse
-
#add_column(name, definition, algorithm: 'INPLACE') ⇒ Object
Add a column to a table.
-
#add_index(columns, index_name = nil) ⇒ Object
Add an index to a table.
-
#add_unique_index(columns, index_name = nil) ⇒ Object
Add a unique index to a table.
-
#change_column(name, definition) ⇒ Object
Change an existing column to a new definition.
-
#ddl(statement, algorithm: nil) ⇒ Object
Alter a table with a custom statement.
-
#filter(sql) ⇒ String
Filter the data that is copied into the new table by the provided SQL.
-
#initialize(table, connection = nil) ⇒ Migrator
constructor
A new instance of Migrator.
-
#remove_column(name, algorithm: 'INPLACE') ⇒ Object
Remove a column from a table.
-
#remove_index(columns, index_name = nil) ⇒ Object
Remove an index from a table.
-
#rename_column(old, nu, algorithm: 'INPLACE') ⇒ Object
Rename an existing column.
Methods included from SqlHelper
#annotation, #idx_name, #idx_spec, #tagged, #version_string
Methods included from Command
Constructor Details
#initialize(table, connection = nil) ⇒ Migrator
Returns a new instance of Migrator.
18 19 20 21 22 23 24 |
# File 'lib/lhm/migrator.rb', line 18 def initialize(table, connection = nil) @connection = connection @origin = table @name = table.destination_name @statements = [] @renames = {} end |
Instance Attribute Details
#conditions ⇒ Object (readonly)
Returns the value of attribute conditions.
16 17 18 |
# File 'lib/lhm/migrator.rb', line 16 def conditions @conditions end |
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
16 17 18 |
# File 'lib/lhm/migrator.rb', line 16 def connection @connection end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
16 17 18 |
# File 'lib/lhm/migrator.rb', line 16 def name @name end |
#origin ⇒ Object (readonly)
Returns the value of attribute origin.
16 17 18 |
# File 'lib/lhm/migrator.rb', line 16 def origin @origin end |
#renames ⇒ Object (readonly)
Returns the value of attribute renames.
16 17 18 |
# File 'lib/lhm/migrator.rb', line 16 def renames @renames end |
#statements ⇒ Object (readonly)
Returns the value of attribute statements.
16 17 18 |
# File 'lib/lhm/migrator.rb', line 16 def statements @statements end |
Instance Method Details
#add_column(name, definition, algorithm: 'INPLACE') ⇒ Object
Add a column to a table
58 59 60 |
# File 'lib/lhm/migrator.rb', line 58 def add_column(name, definition, algorithm: 'INPLACE') ddl('alter table `%s` add column `%s` %s' % [@name, name, definition], algorithm:) end |
#add_index(columns, index_name = nil) ⇒ Object
Add an index to a table
134 135 136 |
# File 'lib/lhm/migrator.rb', line 134 def add_index(columns, index_name = nil) ddl(index_ddl(columns, false, index_name)) end |
#add_unique_index(columns, index_name = nil) ⇒ Object
Add a unique index to a table
153 154 155 |
# File 'lib/lhm/migrator.rb', line 153 def add_unique_index(columns, index_name = nil) ddl(index_ddl(columns, true, index_name)) end |
#change_column(name, definition) ⇒ Object
Change an existing column to a new definition
72 73 74 75 76 77 78 |
# File 'lib/lhm/migrator.rb', line 72 def change_column(name, definition) if definition.match?(/^(DROP|SET) DEFAULT/i) ddl('alter table `%s` alter column `%s` %s' % [@name, name, definition]) else ddl('alter table `%s` modify column `%s` %s' % [@name, name, definition]) end end |
#ddl(statement, algorithm: nil) ⇒ Object
Don’t write the table name directly into the statement. Use the #name getter instead, because the alter statement will be executed against a temporary table.
Alter a table with a custom statement
42 43 44 45 |
# File 'lib/lhm/migrator.rb', line 42 def ddl(statement, algorithm: nil) full_statement = algorithm ? "#{statement}, ALGORITHM=#{algorithm}" : statement statements << full_statement end |
#filter(sql) ⇒ String
Filter the data that is copied into the new table by the provided SQL. This SQL will be inserted into the copy directly after the “from” statement - so be sure to use inner/outer join syntax and not cross joins.
191 192 193 |
# File 'lib/lhm/migrator.rb', line 191 def filter(sql) @conditions = sql end |
#remove_column(name, algorithm: 'INPLACE') ⇒ Object
Remove a column from a table
115 116 117 |
# File 'lib/lhm/migrator.rb', line 115 def remove_column(name, algorithm: 'INPLACE') ddl('alter table `%s` drop `%s`' % [@name, name], algorithm:) end |
#remove_index(columns, index_name = nil) ⇒ Object
Remove an index from a table
171 172 173 174 175 176 177 |
# File 'lib/lhm/migrator.rb', line 171 def remove_index(columns, index_name = nil) columns = [columns].flatten.map(&:to_sym) from_origin = @origin.indices.find { |_, cols| cols.map(&:to_sym) == columns } index_name ||= from_origin[0] unless from_origin.nil? index_name ||= idx_name(@origin.name, columns) ddl('drop index `%s` on `%s`' % [index_name, @name]) end |
#rename_column(old, nu, algorithm: 'INPLACE') ⇒ Object
Rename an existing column.
91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/lhm/migrator.rb', line 91 def rename_column(old, nu, algorithm: 'INPLACE') col = @origin.columns[old.to_s] definition = col[:type] definition += ' NOT NULL' unless col[:is_nullable] == "YES" definition += " DEFAULT #{@connection.quote(col[:column_default])}" if col[:column_default] definition += " COMMENT #{@connection.quote(col[:comment])}" if col[:comment] definition += " COLLATE #{@connection.quote(col[:collate])}" if col[:collate] ddl('alter table `%s` change column `%s` `%s` %s' % [@name, old, nu, definition], algorithm:) @renames[old.to_s] = nu.to_s end |