如何从magento连接另一个数据库


17

是否可以从Magento连接到另一个数据库并访问数据?

如果需要创建模块,如何创建模块以访问另一个数据库?是否有任何教程从头开始讲述相同的内容?任何想法?

Answers:


18

您需要做的第一件事是在模块的config.xml中创建一个连接。它看起来应该与您的default_setup中的相似/app/etc/local.xml。在这里,您可以将主机指定为localhost,然后设置另一个dbname,也可以完全指定另一个主机。我还使用了一个插座,在此之前也可以使用。

<resources>
    <new_db>
        <connection>
            <host><![CDATA[localhost]]></host>
            <username><![CDATA[db_username]]></username>
            <password><![CDATA[db_password]]></password>
            <dbname><![CDATA[db_name]]></dbname>
            <model>mysql4</model>
            <type>pdo_mysql</type>
            <active>1</active>
        </connection>
    </new_db>
</resources>

现在,在此之后,您将能够连接到该数据库并执行如下查询:

$new_db_resource = Mage::getSingleton('core/resource');
$connection = $new_db_resource->getConnection('new_db');
$results    = $connection->query('SELECT * FROM table');

如果您想通过一个模型要做到这一点,那么你可以指定readwrite并且setup资源,如下所示。这将再次resources在config.xml中的节点内完成,您应该替换test为已设置为模型的模型。

<resources>
    <new_db>
        <connection>
            <host><![CDATA[localhost]]></host>
            <username><![CDATA[db_username]]></username>
            <password><![CDATA[db_password]]></password>
            <dbname><![CDATA[db_name]]></dbname>
            <model>mysql4</model>
            <type>pdo_mysql</type>
            <active>1</active>
        </connection>
    </new_db>
    <test_write>
        <connection>
            <use>new_db</use>
        </connection>
    </test_write>
    <test_read>
        <connection>
            <use>new_db</use>
        </connection>
    </test_read>
    <test_setup>
        <connection>
            <use>new_db</use>
        </connection>
    </test_setup>
</resources>
<models>
    <test>
        <class>My_Test_Model</class>
        <resourceModel>test_resource</resourceModel>
    </test>
    <test_resource>
        <class>My_Test_Model_Resource</class>
        <entities>
            <test>
                <table>test</table>
            </test>
        </entities>
    </test_resource>
</models>

模型本身将尝试在函数中找到其连接信息getConnection /app/code/core/Mage/Core/Model/Resource.php。如果你登录的$name传递,你会看到这样的值poll_writetag_write并且cms_read其中第一部分车型部分匹配的config.xml中,在我们的情况下,你会看到test_writetest_readtest_setup。如果找不到与之匹配的连接core_read,则将使用默认连接,core_write或者core_setup


对不起,它对我不起作用。
bab

我不知道在哪里编写此代码,在哪里执行查询以及在其中进行哪些改动。例如,我键入了<host> <![CDATA [localhost]]> </ host>还是<host> localhost </主持人>等
bab

@bab是否要进行单个查询或与其他数据库一起使用的模型?
David Manners

我正在进行单个查询,但也可以通过模型进行查询。实际上,我正在调查站点上工作。我想通过magento访问此站点的数据库。我读了很多相同的文章,但我不知道在哪里放置此代码。如果可能的话,请告诉我我可以对您的代码进行哪些更改以获得理想的结果。谢谢。
bab

@bab第二个config.xml示例应适用于该模型。您的代码有任何错误吗?
David Manners 2013年

3

阅读完所有这些答案之后,搜索并进行了一些测试,我找到了这个解决方案。这是我写解决方案的博客。

使用Magento 1.9时,我被要求进行多个读取和写入连接。Magento可以在/etc/local.xml中配置读写连接。只需设置标签用途即可让Magento知道哪一个可用。

<default_setup>
    <connection>
        <!-- LOCALHOST -->
        <host>localhost</host>
        <username>root</username>               
        <password>123456</password>
        <dbname>magento_db</dbname>
        <initstatements>SET NAMES utf8</initstatements>
        <model>mysql4</model>
        <type>pdo_mysql</type>
        <pdotype></pdotype>
        <active>1</active>
    </connection>
</default_setup>
<default_read>
    <connection>
        <use/>
        <!-- ANOTHER SERVER -->
        <host>other_server</host>
        <username>root</username>               
        <password>123456</password>
        <dbname>magento_db</dbname>
        <initstatements>SET NAMES utf8</initstatements>
        <model>mysql4</model>
        <type>pdo_mysql</type>
        <pdotype></pdotype>
        <active>1</active>
        </use></connection>
</default_read>
<default_write>
    <connection>
        <use/>
        <!-- LOCALHOST -->
        <host>localhost</host>
        <username>root</username>               
        <password>123456</password>
        <dbname>magento_db</dbname>
        <initstatements>SET NAMES utf8</initstatements>
        <model>mysql4</model>
        <type>pdo_mysql</type>
        <pdotype></pdotype>
        <active>1</active>
        </use></connection>
</default_write>

我们可以像本测试示例一样在同一配置文件中定义n个连接

<test_read>
 <connection>
   <!-- TEST SERVER -->
   <host>test_server</host>
   <username>root</username>
   <password>123456</password>
   <dbname>magento_db</dbname>
   <initstatements>SET NAMES utf8</initstatements>
   <model>mysql4</model>
   <type>pdo_mysql</type>
   <pdotype></pdotype>
   <active>1</active>
 </connection>
</test_read>

限制是将连接应用于整个系统,但我的想法是仅针对某些资源进行设置。在这种情况下,我有一个自定义报告模块,我只想在Order表中建立读取连接。覆盖订单资源后Mage / Sales / Model / Resource / Order.php只需进行3次更新

  1. 进行标记以了解是否该更改连接$ reportConnection。
  2. 更新函数_construct()以创建自定义连接并将其添加到资源数组中。
  3. 更新函数_getConnection()以确定是否使用自定义连接。
//旗
public $ reportConnection = false;

/ **
*只需添加在local.xml'test_read'中定义的连接
* /
受保护的函数_construct(){
    $ this-> _ init('sales / order','entity_id');
    $ this-> _ resources-> getConnection('test_read');
}

/ **
*如果设置了标志,则进行连接
* /
受保护的函数_getConnection($ connectionName){
 如果(isset($ this-> _ connections [$ connectionName])){
   返回$ this-> _ connections [$ connectionName];
    }

   if($ connectionName =='read'&& $ this-> reportConnection)
        $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection('test_read');
   其他{
   如果(!empty($ this-> _ resourcePrefix)){
      $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection(
      $ this-> _ resourcePrefix。'_' $ connectionName);
  }其他{
   $ this-> _ connections [$ connectionName] = $ this-> _ resources-> getConnection($ connectionName);
  }
   }
   返回$ this-> _ connections [$ connectionName];
}

最后一步是使用test_read连接调用Order集合。

//Get the Order model
$model = Mage::getModel('sales/order');
//set the flag
$model->getResource()->reportConnection = true;
//get the collection
$collection = $model->getCollection();

1

在模块etc / config.xml中添加以下代码:

<global>
    <resources>
        <modulename_write>
            <connection>
                <use>modulename_database</use>
            </connection>
        </modulename_write>
        <modulename_read>
            <connection>
                <use>modulename_database</use>
            </connection>
        </modulename_read>
        <modulename_setup>
            <connection>
                <use>core_setup</use>
            </connection>
        </modulename_setup>
        <modulename_database>
            <connection>
                <host><![CDATA[localhost]]></host>
                <username><![CDATA[db_username]]></username>
                <password><![CDATA[db_password]]></password>
                <dbname><![CDATA[tablename]]></dbname>
                <model>mysql4</model>
                <type>pdo_mysql</type>
                <active>1</active>
            </connection>
        </modulename_database>
    </resources>
</global>

要使用新数据库从表中获取数据:

<?php 
    $resource   = Mage::getSingleton('core/resource');
    $conn       = $resource->getConnection('modulename_read');
    $results    = $conn->fetchAll('SELECT * FROM tablename');

    echo "<pre>";
    print_r($results);
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.