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();
}
}