load->database(); $this->db = $CI->db; } public function up() { // {DESCRIPTION} // Add your database upgrade logic here // Example: Create a new table /* $this->db->query(" CREATE TABLE IF NOT EXISTS `" . db_prefix() . "api_custom_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `description` text, `created_at` datetime NOT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; "); */ // Example: Add a new column to existing table /* if (!$this->db->field_exists('new_column', db_prefix() . 'existing_table')) { $this->db->query(" ALTER TABLE `" . db_prefix() . "existing_table` ADD `new_column` varchar(255) NULL AFTER `existing_column` "); } */ // Example: Create an index /* $this->db->query(" ALTER TABLE `" . db_prefix() . "api_usage_logs` ADD INDEX `idx_api_logs_user` (`user_id`, `created_at`) "); */ // Example: Insert default data /* $this->db->insert(db_prefix() . 'api_settings', [ 'setting_name' => 'new_feature_enabled', 'setting_value' => '1', 'created_at' => date('Y-m-d H:i:s') ]); */ } public function down() { // Reverse the changes made in up() // This method should undo everything that up() did // Example: Drop a table /* $this->db->query("DROP TABLE IF EXISTS `" . db_prefix() . "api_custom_table`"); */ // Example: Remove a column /* if ($this->db->field_exists('new_column', db_prefix() . 'existing_table')) { $this->db->query(" ALTER TABLE `" . db_prefix() . "existing_table` DROP COLUMN `new_column` "); } */ // Example: Drop an index /* $this->db->query(" ALTER TABLE `" . db_prefix() . "api_usage_logs` DROP INDEX `idx_api_logs_user` "); */ // Example: Remove inserted data /* $this->db->delete(db_prefix() . 'api_settings', ['setting_name' => 'new_feature_enabled']); */ } } /* MIGRATION BEST PRACTICES: 1. Always check if fields/tables exist before creating/altering 2. Use db_prefix() for all table names 3. Include both up() and down() methods 4. Test migrations on a copy of production data first 5. Keep migrations atomic (each migration does one thing) 6. Document what each migration does in comments 7. Use transactions for complex operations when possible VERSION NUMBERING: - Use incremental version numbers (101, 102, 103, etc.) - Major version jumps (200, 201) for significant changes - Keep version numbers unique across all migrations TESTING MIGRATIONS: 1. Backup your database before running migrations 2. Test on development environment first 3. Run migrations using: php migration_runner.php 4. Verify data integrity after migration 5. Test rollback functionality: php migration_runner.php --rollback EXAMPLE USAGE: # Run all pending migrations php migration_runner.php # Run migrations up to specific version php migration_runner.php --target=205 # Rollback to specific version php migration_runner.php --rollback --target=200 # Rollback one version php migration_runner.php --rollback */