174 lines
5.3 KiB
Markdown
174 lines
5.3 KiB
Markdown
|
---
|
|||
|
title: Codeigniter Database Migrations
|
|||
|
author: geoff-doty
|
|||
|
date: 2012-06-28
|
|||
|
template: article.jade
|
|||
|
---
|
|||
|
|
|||
|
##Overview
|
|||
|
|
|||
|
Migrations are a convenient way for you to alter your database in a structured and organized manner. You **could** edit fragments of SQL by hand but you would then be responsible for telling other developers that they need to go and run them and where they are located.
|
|||
|
|
|||
|
Keeping track of which changes need to be run against which deployment environment also posses an equally challenging situation on every deployment.
|
|||
|
|
|||
|
Migrations **TRIES** to simplify this process by:
|
|||
|
|
|||
|
- Keeping All database changes in the Migrations Folder
|
|||
|
- Versioning each Migration
|
|||
|
- And allow you to account for environment variations
|
|||
|
|
|||
|
|
|||
|
##How it works
|
|||
|
|
|||
|
Migrations are specially named CodeIgniter classes saved in the migrations folder…
|
|||
|
|
|||
|
application/migrations
|
|||
|
|
|||
|
…that allow you to go up or down a migration revision.
|
|||
|
|
|||
|
Migrations files are prefixed with a migration revision number, followed by a meaningful name:
|
|||
|
|
|||
|
001_some_feature.php
|
|||
|
|
|||
|
The Migration class is named differently, so for the above file the migration class skeleton would look like:
|
|||
|
|
|||
|
class Migration_Some_Feature extends MY_Migrations {
|
|||
|
|
|||
|
public function up()
|
|||
|
{
|
|||
|
//code used to update the database
|
|||
|
}
|
|||
|
|
|||
|
public function down()
|
|||
|
{
|
|||
|
//code to reverse what was done in the up() method
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
A custome migration class (MY_Migration) could differ from the default implementation by providing an additional *protected* method
|
|||
|
|
|||
|
_get_environment() {}
|
|||
|
|
|||
|
Added for connivence to organize settings based on environment. The return values should be:
|
|||
|
|
|||
|
- development
|
|||
|
- testing
|
|||
|
- production
|
|||
|
|
|||
|
## Example
|
|||
|
class Migration_Some_Feature extends MY_Migrations {
|
|||
|
|
|||
|
public function up()
|
|||
|
{
|
|||
|
//global code used to update the database schema
|
|||
|
|
|||
|
//environment specific changes
|
|||
|
$environment = $this->_get_environment();
|
|||
|
|
|||
|
if($environment)
|
|||
|
{
|
|||
|
switch($environment)
|
|||
|
{
|
|||
|
case 'development':
|
|||
|
//development settings changes here
|
|||
|
break;
|
|||
|
|
|||
|
case 'testing':
|
|||
|
//testing settings changes here
|
|||
|
break;
|
|||
|
|
|||
|
case 'production' :
|
|||
|
//production settings changes here
|
|||
|
break;
|
|||
|
default:
|
|||
|
log_message('error','unable to determine environment');
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
public function down()
|
|||
|
{
|
|||
|
//code to reverse what was done in the up() method
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
> __NOTE__
|
|||
|
>> There are a more than few classes that can help with developing migrations:
|
|||
|
__dbforge()__ loaded by the migration class, can be used to create and delete tables
|
|||
|
- __active record__ can be used to do simple updates/deletes
|
|||
|
- __log_message()__ to log changes made to the database (console app in mac to watch)
|
|||
|
- ect..
|
|||
|
|
|||
|
## Configuration
|
|||
|
|
|||
|
> Migrations are disabled by default
|
|||
|
|
|||
|
Migrations are managed via the migrations file:
|
|||
|
|
|||
|
application/config/migrations.php
|
|||
|
|
|||
|
There are two settings of importance
|
|||
|
|
|||
|
$config['migration_enabled'] = FALSE;
|
|||
|
$config['migration_version'] = 0;
|
|||
|
|
|||
|
**migration_enabled** switches database migrations on or off and the **migration_version** identifies the migration version this installation should use when triggered (see Updates and Rollbacks)
|
|||
|
|
|||
|
> While **migration_version** lists the target migration version, the current migration version is managed in the the *migrations.version* field in the database. The Migration system automatically version up() or down() based on the version differences -- **WHEN TRIGGERED**!
|
|||
|
|
|||
|
## Updates and Rollbacks
|
|||
|
|
|||
|
Check out my custom `migrate` controller, it provides 4 operations
|
|||
|
|
|||
|
| Method | Description |
|
|||
|
|:--------|:------------|
|
|||
|
| migrate/current | brings database to current version listed in config |
|
|||
|
| migrate/ | alias for _migrate/current/__ |
|
|||
|
| migrate/version/[num] | migrates to [num] revision passed in |
|
|||
|
| migrate/latest | ignores config, and updates to latest migration file |
|
|||
|
|
|||
|
### Usage
|
|||
|
|
|||
|
Usage is _really_ split between to groups, __developers__ and __deployments__.
|
|||
|
|
|||
|
##### Developers Workflow
|
|||
|
|
|||
|
Developers should _NOT_ modify
|
|||
|
|
|||
|
config/migrations.php
|
|||
|
|
|||
|
Instead, developers should manage their local database via
|
|||
|
- _migrate/latest_ to load the latest migration file on their system
|
|||
|
- or _migrate/version/[num]_ to go to a migration version to test
|
|||
|
|
|||
|
##### Deployment Workflow
|
|||
|
|
|||
|
When setting up a deployment, the _config/migrations.php_ would be modified to reflect the version you want that deployment set to:
|
|||
|
|
|||
|
$config['migration_version'] = 121; //used migration version
|
|||
|
|
|||
|
and then run
|
|||
|
|
|||
|
migrate/current
|
|||
|
---
|
|||
|
|
|||
|
|
|||
|
> There currently is no UI, however one could be build based on the return values of the _migrate_ methods.
|
|||
|
|
|||
|
>> Return values:
|
|||
|
- TRUE, If Migration is on the latest version
|
|||
|
- FALSE, If the migration failed
|
|||
|
- INT, revision number successfully updated to
|
|||
|
|
|||
|
|
|||
|
##Additional Resources
|
|||
|
- [Migrations CodeIgniter Manual](http://codeigniter.com/user_guide/libraries/migration.html)
|
|||
|
- [DBForge Manual](http://codeigniter.com/user_guide/database/forge.html)
|
|||
|
- [Active Record Manual](http://codeigniter.com/user_guide/database/active_record.html)
|
|||
|
|
|||
|
|
|||
|
|