ORM
(англ. Object-Relational Mapping, рус. объектно-реляционное отображение, или преобразование)
- ORM - технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных». © Википедия
Если же говорить по-простому, то ORM можно назвать своеобразной прослойкой между Вашим скриптом и Базой Данных (далее: БД). В эту прослойку заложен ряд функций, которые способны собирать простенькие запросы по заранее заложенным шаблонам, вставляя данные, которые Вы заранее укажите для вставки, создавая экземпляр ORM (подробнее ниже).
Как и у всего, у данной реализации есть как плюсы, так и минусы, и вот основная их часть:
- Плюсы:
- Уменьшен риск допущения ошибок в запросах, так как они генерируются автоматически, а имена столбцов указываются в одном месте
(применимо только до тех пор, пока Вам не потребуется составить какой-то более сложный запрос, для реализации которого придётся прибегнуть к обычным функциям работы с кэшем)- Более компактный код (следовательно, скорость разработки немного увеличится)
- Нет нужды дополнительно изучать SQL (до тех пор, пока вам не понадобиться написать более сложные запросы, на которые не способна ORM)
- Все запросы автоматически обрабатываются в отдельном потоке
- Минусы:
- Нельзя составлять сложные условия для выборки данных (проверять несколько столбцов одновременно).
- При отправке update запроса, обновляются все данные, внесённые в экземпляр ORM (нельзя обновить конкретный столбец).
- Существует потеря в производительности, так как в системе присутствуют дополнительные проверки того, какие данные Вы вносите и т.п.
- Так же существует потеря в производительности из-за того, что некоторые функции и защиты для запросов SQL пришлось обособить для всех данных (например, ORM экранирует все строки, дабы избежать SQL-инъекции, хотя далеко не во всех случаях это нужно)
*Вы так же можете указать на тот или иной плюс/минус использования ORM и я включу его в статью
Настало время определиться с тем, что же такое «экземпляр ORM».
Перед тем, как начать работать с данными в таблице, Вы должны сообщить ORM системе имя таблицы, с которой нужно работать, и указать нужные столбцы, сопоставив каждому глобальную переменную из скрипта, куда данные будут записываться при загрузке и откуда данные будут изыматься при обновлении таблицы. Эта совокупность данных и называется экземпляром ORM.
Ну а теперь перейдём к описанию функционала, при помощи которого мы можем управлять ORM системой и "общаться" с ней.
- Создание экземпляра ORM:
PHP код:
native ORM:orm_create(const table[], MySQL:handle = MYSQL_DEFAULT_HANDLE);
- Описание:
Функция orm_create создаёт экземпляр ORM.
- Уничтожение экземпляра ORM:
PHP код:
native orm_destroy(ORM:id);
- Описание:
Функция orm_destroy удаляет экземпляр ORM из памяти плагина.
- Регистрация целочисленной переменной для экземпляра ORM:
PHP код:
native orm_addvar_int(ORM:id, &var, const columnname[]);
- Описание:
Функция orm_addvar_int регистрирует целочисленную переменную, связывая её с указанным столбцом в таблице, к которой привязан экземпляр ORM.
Примечание: Зарегистрировать можно только глобальную переменную, так как плагин не выделяет на своей стороне какой-либо памяти для хранения данных, а лишь записывает адрес указанной переменной, впоследствии обращаясь к ней же. Локальные переменные хранятся в стэке, который отчищается после обработки сегмента кода, в котором была объявлена переменная. Соответственно, хранить данные в локальной переменной на постоянной основе для ORM не представляется возможным.
Так же стоит отметить, что в Pawn нет возможности передать по ссылке адрес конкретного байта (можно передать лишь адрес ячейки), поэтому использование char переменных (напр: "array{idx}") не представляется возможным.
- Регистрация вещественной переменной для экземпляра ORM:
PHP код:
native orm_addvar_float(ORM:id, &Float:var, const columnname[]);
- Описание:
Функция orm_addvar_float регистрирует вещественную переменную, связывая её с указанным столбцом в таблице, к которой привязан экземпляр ORM.
- Регистрация переменной с текстом для экземпляра ORM:
PHP код:
native orm_addvar_string(ORM:id, var[], var_maxlen, const columnname[]);
- Описание:
Функция orm_addvar_string регистрирует переменную, хранящую текст, связывая её с указанным столбцом в таблице, к которой привязан экземпляр ORM.
- Обнуление переменных, зарегистрированных в экземпляре ORM:
PHP код:
native orm_clear_vars(ORM:id);
- Описание:
Функция orm_clear_vars устанавливает значение, равное нулю, для всех переменных, зарегистрированных ранее в экземпляре ORM.
- Удаление ранее зарегистрированной переменной в экземпляре ORM:
PHP код:
native orm_delvar(ORM:id, const columnname[]);
- Описание:
Функция orm_delvar удаляет ранее зарегистрированную переменную в экземпляре ORM по имени столбца.
- Установка зарегистрированной в экземпляре ORM переменной в качестве ключа:
PHP код:
native orm_setkey(ORM:id, const columnname[]);
- Описание:
Функция orm_setkey устанавливает ранее зарегистрированную переменную в качестве ключа.
Иными словами, выбранная переменная станет формировать условие выборки (всё, что находится после WHERE в обычном запросе).
Одновременно может быть установлена только одна переменная в качестве ключа.
- Отправка запроса на выборку данных из таблицы в экземпляр ORM (загрузка данных):
PHP код:
native orm_select(ORM:id, const callback[] = "", const format[] = "", {Float, _}:...);
- Описание:
Функция orm_select формирует и отправляет запрос SELECT в таблицу для выгрузки данных в зарегистрированные переменные.
orm_load является полным аналогом функции orm_select
Запрос формируется по следующему шаблону:
PHP код:
SELECT
/* переменная_1 */,
/* переменная_2 */,
/* переменная_3 */,
/* все оставшиеся зарегистрированные переменные, кроме той, что установлена в качестве ключа */
FROM
/* таблица */
WHERE
/* имя столбца, установленного в качестве ключа*/ = /*текущее значение переменной, установленной в качестве ключа */
- Отправка запроса на обновление данных в таблице:
PHP код:
native orm_update(ORM:id, const callback[] = "", const format[] = "", {Float, _}:...);
- Описание:
Функция orm_update формирует и отправляет запрос UPDATE в таблицу для обновления данных в ней исходя из значений в зарегистрированных переменных (обновляются сразу все переменные).
Запрос формируется по следующему шаблону:
PHP код:
UPDATE
/* таблица */
SET
/* столбец_1 */ = /* переменная_1 */,
/* столбец_2 */ = /* переменная_2 */,
/* столбец_3 */ = /* переменная_3 */,
/* все оставшиеся зарегистрированные столбцы/переменные, кроме той, что установлена в качестве ключа */
WHERE
/* имя столбца, установленного в качестве ключа*/ = /*текущее значение переменной, установленной в качестве ключа */
- Отправка запроса на создание данных в таблице:
PHP код:
native orm_insert(ORM:id, const callback[] = "", const format[] = "", {Float, _}:...);
- Описание:
Функция orm_insert формирует и отправляет запрос INSERT в таблицу для создания данных в ней исходя из значений в зарегистрированных переменных.
Запрос формируется по следующему шаблону:
PHP код:
INSERT INTO
/* таблица */
(
/* столбец_1 */,
/* столбец_2 */,
/* столбец_3 */,
/* все оставшиеся зарегистрированные столбцы */
)
VALUES
(
/* переменная_1 */,
/* переменная_2 */,
/* переменная_3 */,
/* все оставшиеся зарегистрированные переменные */
)
- Отправка запроса на удаление данных из таблицы:
PHP код:
native orm_delete(ORM:id, const callback[] = "", const format[] = "", {Float, _}:...);
- Описание:
Функция orm_delete формирует и отправляет запрос DELETE в таблицу для удаления данных из неё исходя из значения переменной, указанной в качестве ключа.
Запрос формируется по следующему шаблону:
PHP код:
DELETE FROM /* таблица */ WHERE /* имя столбца, установленного в качестве ключа */ = /*текущее значение переменной, установленной в качестве ключа */
- Отправка запроса на обновление данных в таблице или создание этих данных, если ранее они не были созданы:
PHP код:
native orm_save(ORM:id, const callback[] = "", const format[] = "", {Float, _}:...);
- Описание:
Функция orm_save совмещает в себе функционал "orm_insert" и "orm_update".
То, какой именно запрос будет отправлен, зависит от того, имеется ли в переменной, указанной в качестве ключа, какое-либо значение или там указан нуль/пустая строка.
То бишь, если в качестве ключа установлена переменная pAccountID (целочисленная переменная) и её значение равно нулю (а в MySQL столбцы, имеющие атрибут AUTO_INCREMENT, который должен быть установлен у столбца "account_id", не могут иметь нулевое значение), то данная функция отправит запрос INSERT, создавая новую строку. Так же будет и в случае, если в качестве ключа установлен массив pName (переменная с текстом) и в нём не записано никакое значение. Если же в переменной ключа будет записано какое-либо значение, функция отправит запрос UPDATE
- Выгрузка данных из активного кэша в переменные экземпляра ORM:
PHP код:
native orm_apply_cache(ORM:id, row_idx, result_idx = 0);
- Описание:
Функция orm_apply_cache извлекает данные из кэша, помещая их в переменные экземпляра ORM.
Иными словами, Вы можете составить обычный запрос (пригодится, когда нужно сделать выборку по нескольким условиям, а не только по одному) и отправить его при помощи mysql_(t/p)query, а уже результат обрабатывать не через cache_get_value_index(...), а использовать данную функцию, которая сама запишет данные в нужные переменные.
- Поиск ошибок в отправленном запросе ORM:
PHP код:
native E_ORM_ERROR:orm_errno(ORM:id);
- Описание:
Функция orm_errno даёт информацию о качестве последнего запроса, возвращая одно из трех значений.
Если есть какие-либо вопросы, прошу написать об этом в комментариях.Автор статьи - DeimoS
Копирование данного материала без разрешения автора запрещено
Интересные статьи на подобную тему:
* [Урок] Создание системы регистрации на основе плагина MySQL [R39-R41] (ORM)(в разработке)