【问题标题】:is it possible to connect two dbms MySQLand postgres SQL in codeigniter?是否可以在 codeigniter 中连接两个 dbms MySQL 和 postgresQL?
【发布时间】:2014-08-09 10:54:15
【问题描述】:

我正在开发相当规模的项目,该项目正处于开发阶段,使用 MySQL 作为主数据库。现在,客户端有一些数据,在 postgres SQL 中,无法转换为 MySQL。所以,我知道如果两个数据库的 dbdriver 相同,比如两个数据库都是 MySQL,那么我可以连接它。但这里的问题是,有两种不同的数据库管理系统具有不同的数据库驱动程序。那么如何同时连接两个数据库呢? 在我的 database.php 文件中,代码是:

    $active_group = 'default';
    $active_record = TRUE;

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'xxx';
$db['default']['password'] = 'xxxxx';
$db['default']['database'] = 'xxxx';
$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;


// ************************ anotherDatabase Connect *****************************************************

$db['database2']['hostname'] = 'xxx.xxx.xxx.xxx'; //ip address of the remote database
$db['database2']['username'] = 'xxxx';
$db['database2']['password'] = 'xxxx';
$db['database2']['database'] = 'xxxx';
$db['database2']['dbdriver'] = 'postgre';
$db['database2']['dbprefix'] = '';
$db['database2']['pconnect'] = TRUE;
$db['database2']['db_debug'] = TRUE;
$db['database2']['cache_on'] = FALSE;
$db['database2']['cachedir'] = '';
$db['database2']['char_set'] = 'utf8';
$db['database2']['dbcollat'] = 'utf8_general_ci';
$db['database2']['swap_pre'] = '';
$db['database2']['autoinit'] = TRUE;
$db['database2']['stricton'] = FALSE; 
$db['database2']['port'] = 5433;

上周我一直在寻找这个并浏览了很多帖子,但没有关于它的明确信息。为了测试它,我编写了以下代码。

class C_test extends CI_Controller {

  public function index()
    {
    echo "Test";
    //$this->db->close();
    //$db1 = $this->load->database('default',true);
    $this->db2 = $this->load->database('database2',true);

    echo "databasa Test ";


    // $test1 = $db1->get('table_name')->result_array();
    //print_r($test1); 

    //$this->db->close();

    echo "=====================================================";

    $test = $this->db2->get('table_name')->result_array();
    //$test = $db2->get('admin')->result_array();
    print_r($test); 

    }
}

【问题讨论】:

  • 在你的问题中,你想问$this->db2 = $this->load->database('database2',true);不工作,而$db1 = $this->load->database('default',true);工作,对吧?
  • 你会尝试通过pconnectFALSE 吗?
  • $db['database2']['port'] = 5432;
  • 不要用 MySQL 测试,然后尝试实时部署到 PostgreSQL。您需要将测试环境切换到 PostgreSQL(或者最好在两者上进行测试)。否则会导致疼痛。

标签: php mysql database codeigniter postgresql


【解决方案1】:

首先在 php.ini 中启用 Postgresql 扩展

extension=php_pgsql.dll

您也可以为 PDO 启用 Postgresql 扩展。

extension=php_pdo_pgsql.dll

那么,

$db['database2']['hostname'] = 'localhost';
$db['database2']['username'] = 'postgres';
$db['database2']['password'] = 'postgres';
$db['database2']['database'] = 'abc_gis';
$db['database2']['dbdriver'] = 'postgre';
$db['database2']['dbprefix'] = '';
$db['database2']['pconnect'] = TRUE;
$db['database2']['db_debug'] = TRUE;
$db['database2']['cache_on'] = FALSE;
$db['database2']['cachedir'] = '';
$db['database2']['char_set'] = 'utf8';
$db['database2']['dbcollat'] = 'utf8_general_ci';
$db['database2']['swap_pre'] = '';
$db['database2']['autoinit'] = TRUE;
$db['database2']['stricton'] = FALSE;
$db['database2']['port'] = 5432; // In question 5433 is written!

要解决这个问题,请更改 /system/database/DB_driver.php 中的 simple_query 函数:

function simple_query($sql)
{
    if ( ! $this->conn_id)
    {
        $this->initialize();
    }

    $this->db_select(); //<-----------------  Added this line
    return $this->_execute($sql);
}

这完全解决了问题,所以你可以在模型中做这样的事情

$this->db2 = $this->load->database('database2',true);

Ref1, Ref2

【讨论】:

  • 感谢 Shaunak,但我使用的是 linux 12.04 VPS,因此 extension=php_pgsql.dll 将不存在。而且我确信我在配置中遗漏了一些非常小的东西!!。
  • 你好 Shaunak,问题已经解决,我已经成功地连接了两个数据库和两个不同的 dbdrivers,最后一切都结束了:)。非常感谢你的帮助。高度赞赏。
  • Shaunak,我能够在不提供 PORT 的情况下进行连接,而无需执行“pconnect”值 FALSE。
  • @AshishJoshi,那么你必须在这里分享你的答案,为那些遇到同样问题的人!
猜你喜欢
  • 2020-11-21
  • 2015-06-20
  • 2021-12-04
  • 1970-01-01
  • 2020-05-22
  • 2014-07-19
  • 2020-09-13
  • 2016-08-15
  • 1970-01-01
相关资源
最近更新 更多