CI 묻고 답하기

제목 CI 다중 DB 사용 관련 질문드립니다.
카테고리 CI 2, 3
글쓴이 구리부기 작성시각 2018/10/16 21:22:50
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 19814   RSS

안녕하세요. 

구글링과 노가다로 이것저것 해봐서는 도저히 답이 나오지 않아 선배님들의 도움을 요청드립니다.ㅜㅜ

CI database.php 에 default 외에 추가 DB를 셋팅한 상태에서

model 단에서 다른 DB 정보를 가져다가 테이블 생성 기능의 소스를 실행하려고 했습니다.

아래는 database.php 의 소스이구요..

$active_group = 'default';
$query_builder = TRUE;

$dbconfig = array(
    // default
    'default' => array(
        'hostname' => '127.0.0.1',
        'username' => 'user_01',
        'password' => '1234',
        'database' => 'db11',
    ),
    'sale_log' => array(
        'hostname' => '127.0.0.1',
        'username' => 'user_01',
        'password' => '1234',
        'database' => 'db22',
    ),
);

foreach($dbconfig as $k => $v) {
    $db[$k]['dsn'] = '';
    $db[$k]['hostname'] = $v['hostname'];
    $db[$k]['username'] = $v['username'];
    $db[$k]['password'] = $v['password'];
    $db[$k]['database'] = $v['database'];
    $db[$k]['dbdriver'] = 'mysqli';
    $db[$k]['dbprefix'] = '';
    $db[$k]['pconnect'] = FALSE;
    $db[$k]['db_debug'] = (ENVIRONMENT !== 'production');
    $db[$k]['cache_on'] = FALSE;
    $db[$k]['cachedir'] = '';
    $db[$k]['char_set'] = 'utf8';
    $db[$k]['dbcollat'] = 'utf8_general_ci';
    $db[$k]['swap_pre'] = '';
    $db[$k]['encrypt'] = FALSE;
    $db[$k]['compress'] = FALSE;
    $db[$k]['stricton'] = FALSE;
    $db[$k]['failover'] = array();
    $db[$k]['save_queries'] = TRUE;
}

이렇게 셋팅해놓고

모델 파일의  __construct 에서 

$this->db2 = $this->load->database('sale_log'); <- 요렇게도 해보고

메소드에서

$db2 = $this->load->database('sale_log'); <- 요렇게도 불러보고 해봤는데

계속 테이블은 default 로 설정한 DB에 생성이 됩니다.ㅜㅜ

계속 구글링해보면서 이것저것 해보다가  CI 메뉴얼에 있는 메소드 자체에다가도

$config['hostname'] = '127.0.0.1';
$config['username'] = 'user_01';
$config['password'] = '1234';
$config['database'] = 'db22';
$config['dbdriver'] = 'mysqli';
$config['dbprefix'] = '';
$config['pconnect'] = FALSE;
$config['db_debug'] = (ENVIRONMENT !== 'production');
$config['cache_on'] = FALSE;
$config['cachedir'] = '';
$config['char_set'] = 'utf8';
$config['dbcollat'] = 'utf8_general_ci';
$config['swap_pre'] = '';
$config['encrypt'] = FALSE;
$config['compress'] = FALSE;
$config['stricton'] = FALSE;
$config['failover'] = array();
$config['save_queries'] = TRUE;
$this->load->database($config);

이렇게 해서도 해봤는데 여전히 default DB에 생성이 되네요.ㅜㅜ

아래는 모델의 소스 입니다.

class Cron2biz extends CI_Model {

    public function __construct() { // {{{
        parent::__construct();
    } // }}}

    // 테이블 생성
    public function create_calculate_fee_log() {       
        $config['hostname'] = '127.0.0.1';
        $config['username'] = 'user_01';
        $config['password'] = '1234';
        $config['database'] = 'db22';
        $config['dbdriver'] = 'mysqli';
        $config['dbprefix'] = '';
        $config['pconnect'] = FALSE;
        $config['db_debug'] = (ENVIRONMENT !== 'production');
        $config['cache_on'] = FALSE;
        $config['cachedir'] = '';
        $config['char_set'] = 'utf8';
        $config['dbcollat'] = 'utf8_general_ci';
        $config['swap_pre'] = '';
        $config['encrypt'] = FALSE;
        $config['compress'] = FALSE;
        $config['stricton'] = FALSE;
        $config['failover'] = array();
        $config['save_queries'] = TRUE;

        fn_log(222);
        $this->load->database($config);

        $this->load->dbforge();
        try{
            fn_log(333);
            $this->db->trans_begin();

            // 만들 테이블의 필드값 정의
            $fields = array(
                'cfl_srl' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                    'unsigned' => TRUE,
                    'auto_increment' => TRUE,
                ),
                'user_srl' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'coin_code' => array(
                    'type' =>'VARCHAR',
                    'constraint' => '50',
                ),
                'base_code' => array(
                    'type' =>'VARCHAR',
                    'constraint' => '50',
                ),
                'earn_fee' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'od_srl' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'trade_code' => array(
                    'type' =>'VARCHAR',
                    'constraint' => '50',
                ),
                'od_qty' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'od_price' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'od_total_price' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'od_fee' => array(
                    'type' => 'BIGINT',
                    'constraint' => 20,
                ),
                'fee_type' => array(
                    'type' => 'TINYINT',
                    'constraint' => 4,
                ),
                'od_tool_code' => array(
                    'type' =>'VARCHAR',
                    'constraint' => '50',
                ),
                'trade_date' => array(
                    'type' => 'datetime',
                    'default' => '0000-00-00 00:00:00',
                ),
            );

            // 정의한 필드값 적용
            $this->dbforge->add_field($fields);

            // 인덱스 정의
            $this->dbforge->add_key('cfl_srl');

            // 테이블명 log_ + 당일 날짜
            $tb_name = date('Y-m-d');
            $tb_name = 'log_'.$tb_name;
            fn_log($tb_name, 'tb_name');
            $return = $this->dbforge->create_table($tb_name, TRUE);

            // 생성 결과가 없으면 에러 반환
            if (empty($return)) except('log_error_01');
            fn_log(444);

            // 커밋
            $this->db->trans_commit();
            fn_log(555);
            $return = array();
            $return['msg'] = 'success';
        } catch (Exception $e) {
            fn_log(666);
            if(!empty($e->getCode())) $this->db->trans_rollback();
            $return['msg'] = 'error';
            $return['data'] = $e->getMessage();
        }

        return $return;
    }
 다음글 CI에서 서브도메인에 대해서 로그인 세션 분리 (4)
 이전글 PHPExcel 사용을 하려고 합니다. (7)

댓글

변종원(웅파) / 2018/10/17 10:27:49 / 추천 0

ci는 매뉴얼이 잘되어 있는 편입니다. 상당히 많은 질문들이 매뉴얼에서 해결됩니다. ^^

매뉴얼 보시면 뭐가 빠졌는지 아실겁니다.

여러 데이터베이스 연결하기 http://www.ciboard.co.kr/user_guide/kr/database/connecting.html#connecting-to-multiple-databases

 

한대승(불의회상) / 2018/10/17 10:54:51 / 추천 0

메뉴얼 자세히 보셔도 잘 이해되지 않으실까봐 힌트

두번째 옵션이 필요합니다.

구리부기 / 2018/10/17 10:56:07 / 추천 0

변종원(웅파))

아.. 정말 부끄럽습니다. 그렇게 메뉴얼을 봤다고 생각했는데, 

왜 $this->db->db_select($database2_name); <- 이걸 못봤을까요.

잘 해결되서 기쁘면서도 부끄럽네요. 더 공부하도록 하겠습니다,

도움주신 웅파님 감사합니다.

구리부기 / 2018/10/17 10:58:00 / 추천 0

한대승(불의회상) 

네...^^

왜 두번째 옵션을 못봤는지 모르겠어요.. 이 한줄 때문에 거의 하루를...ㅜㅜ

웅파님 분의회상님 두분 모두 감사드려요~

변종원(웅파) / 2018/10/17 11:06:11 / 추천 0
__construct 에서 아래와 같이 선언하고
$this->db2 = $this->load->database('sale_log', true);

 

$this->db2->query() 형태로도 사용합니다. ^^