среда, 23 марта 2011 г.

Прямые SQL-запросы в Magento

Столкнувшись с необходимостью использовать прямое обращение к базе данных в Magento, нашел полезную статью и перевел ее в первую очередь для себя (чтобы лучше усволась). Первоисточник находится здесь.

Использование в Magento моделей данных (data models) предоставляет великолепную возможность для получения и редактирования данных. Используя метко именованные методы и искусные абстракции, Varien полностью скрывает совокупность SQL-запросов, необходимых для выполнения операций с данными. Но облегчая изучение моделей, это часто влияет на скорость операций, а следовательно и на отзывчивость вашего сайта. Это в особенности справедливо при сохранении моделей, использующих архитектуру EAV. Чаще всего этого нельзя избежать, однако бывают ситуации, когда прямое выполнение SQL-запросов было бы проще и гораздо быстрее. Примером этого является глобальное обновление цен продуктов в Magento. Было бы довольно просто написать немного кода, который обойдет все продукты и изменит цену. В больших наборах данных сохранение каждого отдельного продукта может занять много времени и соответственно сделать систему недоступной. Для борьбы с этим можно использовать прямой SQL-запрос, который сможет обновить 1000 продуктов за 1-2 секунды.

Для более подробной информации о массовом обновлении цен, смотрите следующую статью:
Magento: Update Product Prices Globally.


Подключение к БД в Magento

По умолчанию Magentoавтоматически подключается к вашей базе данных и предоставляет два разных ресурса, которые вы можете использовать для доступа к данным: core_read и core_write. Как вы можете догадаться, core_read предназначен для чтения из БД, тогда как core_write служит для записи в БД. Важно убедиться, что вы используете правильный ресурс при чтении или записи данных в БД.

Имена таблиц и префиксы таблиц
При установке Magento вы получаете возможность использовать префикс таблиц. Префикс таблиц это строка симовлов, которая добавляется в начале имени каждой таблицы в вашей базе данных. Это полезно, если вы устанавливаете несколько систем в одну базу данных, так как помогает различать данные разных приложений. К счастью Magento имеет встроенную функцию для добавления префикса к заданному имени таблицы.
<?php
$tableName = Mage::getSingleton('core/resource')
    ->getTableName('catalog_product_entity');

// if prefix was 'mage_' then the below statement
// would print out mage_catalog_product_entity
echo $tableName;
?>

Доступ к ресурсу подключения к БД
<?php
$read = Mage::getSingleton('core/resource')->getConnection('core_read');
$write = Mage::getSingleton('core/resource')->getConnection('core_write');
?>
Функция getConnection() в качестве принимает имя ресурса, который вы пытаетесь запросить и возвращает объект класса Varien_Db_Adapter_Pdo_Mysql. Этот клас наследуется от Zend_Db_Adapter_Abstract и следовательно вы можете выполнять все функции класса Zend DB Adapter.

Для получения списка доступных функций скопируйте следующий код в шаблон Magento.
<?php
$read = Mage::getSingleton('core/resource')->getConnection('core_read');

echo '<pre>';
print_r(get_class_methods($read));
echo '</pre>';
exit;
?>
Это должно выдать список доступных функций и поможет проиллюстрировать, что именно вы можете сделать с помощью этого объекта.

Чтение данных из БД
<?php
$read = Mage::getSingleton('core/resource')->getConnection('core_read');
$query = 'SELECT * FROM ' . Mage::getSingleton('core/resource')
    ->getTableName('catalog_product_entity');
$results = $read->fetchAll($query);

print_r($results);
?>
Если в вашем магазине Magento есть какие-либо продукты, то приведенный выше код напечатает основные данные об этих продуктах.

Запись данных в БД
<?php
$write = Mage::getSingleton('core/resource')->getConnection('core_write');

// Add your own query below
// I didn't add one as I didn't want you to run the code
// and me break your database!
$query = 'add your query here';
$write->query($query);
?>

Напишите свой SQL-запрос в переменной $query выше и выполните код. Если ваш запрос правильный, он должен быть выполнен корректно и данные должны измениться как указано в запросе.

Заключение

Иногда необходимо напрямую выполнить SQL-запрос в Magento, однако будьте осторонжны пожалуйста! Использование моделей Magento обоснованно и обспечивает уровень безопасности, который вам придется вручную добавить к вашим прямым SQL-запросам. Убедитесь, что избежите любого пользовательского ввода и когда это возможно придерживайтесь методов моделей Magento!

В качестве примечания, если вы будете обращаться к БД напрямую, было бы неплохо изучить архитектуру EAV, используемую в базе данных Magento.

Для более подробной информации смотрите следующую статью:
Magento Database Structure: EAV

Дополнительные ссылки по теме:
The EAV Data Model

Комментариев нет:

Отправить комментарий

Спасибо за ваш комментарий!