2014.04.22
codeigniterで複数データベース切替方法について
codeigniterでデータベース切替を行うためにはどうしたらよいかを試行錯誤してみました。こんな方法でいいんだとわかったことを記述します。
データベースの記述箇所は、application/config/database.php だと分かります。記述例は以下のようになります。
$db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "database_name"; $db['default']['dbdriver'] = "mysql"; $db['default']['dbprefix'] = ""; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = FALSE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ""; $db['default']['char_set'] = "utf8"; $db['default']['dbcollat'] = "utf8_general_ci"; $db['default']['swap_pre'] = ""; $db['default']['autoinit'] = TRUE; $db['default']['stricton'] = FALSE;複数の場合は、以下のようにもうひとつの設定を書き込み、$this->load->database(‘db2’); を読み込むことで2つ目のDBに切り替えることが可能です。
$db['db2']['hostname'] = "localhost"; $db['db2']['username'] = "root"; $db['db2']['password'] = ""; $db['db2']['database'] = "database_name2"; $db['db2']['dbdriver'] = "mysql"; $db['db2']['dbprefix'] = ""; $db['db2']['pconnect'] = TRUE; $db['db2']['db_debug'] = FALSE; $db['db2']['cache_on'] = FALSE; $db['db2']['cachedir'] = ""; $db['db2']['char_set'] = "utf8"; $db['db2']['dbcollat'] = "utf8_general_ci"; $db['db2']['swap_pre'] = ""; $db['db2']['autoinit'] = TRUE; $db['db2']['stricton'] = FALSE;ただ、それだと設定ファイルを記述する手間があり少し面倒です。 そこでフレームワーク内のクラスCI_DB_driverに以下の記述があり$this->db_select()の箇所で選択されたデータベースに接続していることが分かります。
function initialize() { // If an existing connection resource is available // there is no need to connect and select the database if (is_resource($this->conn_id) OR is_object($this->conn_id)) { return TRUE; } // ---------------------------------------------------------------- // Connect to the database and set the connection ID $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect(); // No connection resource? Throw an error if ( ! $this->conn_id) { log_message('error', 'Unable to connect to the database'); if ($this->db_debug) { $this->display_error('db_unable_to_connect'); } return FALSE; } // ---------------------------------------------------------------- // Select the DB... assuming a database name is specified in the config file if ($this->database != '') { if ( ! $this->db_select()) { log_message('error', 'Unable to select database: '.$this->database); if ($this->db_debug) { $this->display_error('db_unable_to_select', $this->database); } return FALSE; } else { // We've selected the DB. Now we set the character set if ( ! $this->db_set_charset($this->char_set, $this->dbcollat)) { return FALSE; } return TRUE; } } return TRUE; }上記のソースコードを参考にヘルパーにdatabase_helper.phpを作成して以下の様な切替関数を作ることでデータベース名を指定することで切り替えができました。
if ( ! function_exists('switch_company_database')) { function switch_company_database($company_name) { $CI =& get_instance(); $CI->db->database = $company_name; $CI->db->db_select(); } }