Magento用SQL语句开发篇

有时为了调试magento,需要获取当前的查询sql语句,在magento中获取SQL语句,这里我们通过

$collection->getSelectSql(true)来调试sql

$collection=Mage::getResourceModel('reports/product_collection');
      $query=$collection->getSelectSql(true);
      echo $query;

magento获取SQL语句的另外一种方法是设置打印SQL为true

      $collection=Mage::getResourceModel('reports/product_collection');
      $collection->printlogquery(true);

得到的SQL语句

SELECT `e`.* FROM `catalog_product_entity` AS `e`

这里只是打印查询产品的SQL,如果要获取其他地方的SQL语句,道理也是一样的,我们根据上面的sql语句可以看到,其实magento的性能很差,”select *”,magetno又是基于EAV(Entity Attribute Value)模型架构的,可以想象下这速度

Magento的Models 和Collection 很强大,使用它们可以很方便的查询和操作数据库。开发中,因为一些特殊需求或对Magento的了解不够深,可能会需要自己手写SQL语句来查询和操作数据库。以下分别是读写数据库的代码。

      // For Read   
      // fetch read database connection that is used in Mage_Core module     
        
      $read= Mage::getSingleton('core/resource')->getConnection('core_read');   
        
      // first way     
      $query = $read->query("select name from core_website");     
      while ($row = $query->fetch())    
      {    
          $row = new Varien_Object($row);     
          echo "<strong>" . $row->getName() . "</strong><br/>";   
      }   
        
      // second way      
      $results = $read->fetchAll("SELECT * FROM core_website;");    
      foreach ($results as $row)      
      {   
          echo $row['name'] . "<br/>";     
      }   
    
      // For Write   
      // fetch write database connection that is used in Mage_Core module     
      $write = Mage::getSingleton('core/resource')->getConnection('core_write');   
        
      // now $write is an instance of Zend_Db_Adapter_Abstract     
      $write->query("insert into tablename values ('aaa','bbb','ccc')");  
    

注意上面的getConnection()方法中的参数 “core_read”,表明了Magento将要使用的资源。与之相对应,当我们修改数据库的时候使用参数”core_write”.一般情况下 getConnection方法的参数应设成”core_read” 或 “core_write”(应该不指定也是可以的,但是如果Magento有多个数据库就必须指定了)。

作为新的entension module,在config.xml对”core_read” “core_write” 进行定义是个好的习惯。定义如下: 

      <config>  
          <global>  
              <resources>  
                  <extension_setup>  
                      <connection>  
                          <use>core_setup</use>  
                      </connection>  
                  </extension_setup>  
                  <extension_read>  
                      <connection>  
                          <use>core_read</use>  
                      </connection>  
                  </extension_read>  
                  <extension_write>  
                      <connection>  
                          <use>core_write</use>  
                      </connection>  
                  </extension_write>  
              </resources>  
          </global>  
      </config> 

对应上面新增的module的名字.使用下面相对应的语句在read或write Database:

      $conn = Mage::getSingleton('core/resource')->getConnection('extension_read');   
      $conn = Mage::getSingleton('core/resource')->getConnection('extension_write');  
    

一般情况是绝大多数的module都定义成”core_read” “core_write”方便且节省资源。当然特殊情况除外:

给每个module不同的读写权限
需要用多个Database

相关文章:

1、Magento中获取Zend DB对象中的SQL语句
https://www.onexin.net/magento-zend-db-object-for-sql-statements/

2、Magento常用SQL语句实用篇
https://www.onexin.net/practical-tips-commonly-used-sql-statement-magento/

3、教你看懂Magento中的SQL语句
https://www.onexin.net/magento-teach-you-to-understand-the-sql-statement/

4、Magento中如何调用SQL语句
https://www.onexin.net/how-to-call-sql-statements-magento/

5、创建 PDO 实例请求连接SQL数据库
https://www.onexin.net/pdo-database/

转载请注明出处:https://www.onexin.net/posts-with-the-sql-statement-magento-development/

Leave a Reply

Your email address will not be published. Required fields are marked *