Sign in to follow this  
Followers 0
W1nStoN

Мануал по работе с ORM-конструкциями в MySQL

2 posts in this topic

Доброго времени суток, пользователи pawno-rus. Сегодня я хотел бы поведать, а кому-то напомнить об отличительной особенности R33-34 версии плагина MySQL - ORM конструкции
ИМХО Я считаю, данные конструкции намного проще и удобнее, нежели стандартное оформление запросов MySQL к которым вы так привыкли. А многих привлечет то, что эти конструкции, в 3, а то и в 4 раза короче (по написанию), чем обычные запросы.


Приступим:

Существует 4 основных типа запросов:
SELECT – выбрать строки из таблицы
INSERT – добавить строки в таблицу
UPDATE – изменить строки в таблице
DELETE – удалить строки из таблицы
Как же мы привыкли видеть их в коде, давайте рассмотрим на примере запроса UPDATE:

new sql_query[62];  
mysql_format(dbConnect, sql_query , "SELECT * FROM `accounts` WHERE Name = %s", PlayerInfo[playerid][pName]); 
mysql_tquery(dbConnect, sql_query , "LoadPlayers", "d", playerid);

Те же стандартные запросы, но с использованием ORM выглядят так:
orm_select(ORM:id, callback, format, float) и orm_load(ORM:id, callback, format, float) - сценарий идентичен запросу  SELECT
orm_update(ORM:id) 
- сценарий идентичен запросу UPDATE
orm_insert(ORM:id, callback, format, float) 
- сценарий идентичен запросу INSERT
orm_delete(ORM:id) 
- сценарий идентичен запросу DELETE
orm_save(ORM:id, callback, format, float) 
- данный сценарий представляет собой соединение INSERT и UPDATE, если строка не найдена в таблице, то сценарий выполнит INSERT, а если она есть, то UPDATE

 

Теперь давайте разберем этот же запрос, но уже на примере ORM-конструкции:

orm_select(PlayerInfo[playerid][ORM_ID], "LoadPlayers", "d", playerid); // где ORM_ID - идентификатор
Очень компактно, согласитесь, такое видеть намного приятнее.
Предлагаю посмотреть еще один вариант на примере системы регистрации/авторизации. 
Вот так это выглядит при обычном построении запросов:
forward LoadPlayers(playerid);
public LoadPlayers(playerid) 
{
    new rows;
    cache_get_row_count(rows);
    if(!rows) return PlayerRegister(playerid);
    cache_get_valeue_name(0, "Name", PlayerInfo[playerid][pName]);
    cache_get_valeue_name(0, "Password", PlayerInfo[playerid][pPassword]);  
    cache_get_valeue_name_int(0, "Level", PlayerInfo[playerid][pLevel]);
    cache_get_valeue_name_float(0, "Health", PlayerInfo[playerid][pHealth]);      
    return true;
}

Теперь покажем, как бы это выглядело при использовании ORM:

forward LoadPlayers(playerid);
public LoadPlayers(playerid) 
{
    switch(orm_errno(PlayerInfo[playerid][ORM_ID]))
    {
        case ERROR_OK: LoadPlayers(playerid) // Данные игрока найдены, посылаем его на авторизацию!
        case ERROR_NO_DATA: PlayerRegister(playerid) // Данные игрока не найдены, посылаем его на регистрацию!        
   }
   return true;
}
Опять код нас радует своей минималистичностью, но чтобы использовать такой вариант, нам необходимо поработать.
Создадим enum, в котором у нас будут переменные, хранящие данные игрока:
enum pInfo
{
    ORM:ORM_ID, // идентификатор ORM
    pID,
    pName[24],
    pPassword[32],
    pLevel,
    Float:pHealth
}
new PlayerInfo[MAX_PLAYERS][pInfo];
Далее идем в public OnPlayerConnect(playerid) и пишем следующее:
GetPlayerName(playerid, NameString, sizeof(NameString)); // получаем имя игрока при подключении
PlayerInfo[playerid][ORM_ID] = orm_create("accounts"); // создаем ORM, где accounts - имя нашей таблицы с игроками
// присвоим переменным их значения из базы данных (подробнее в следующем уроке)
new orm = PlayerInfo[playerid][ORM_ID]; // для упрощения кода
orm_addvar_int(orm, PlayerInfo[playerid][pID], "ID");
orm_addvar_string(orm, PlayerInfo[playerid][pName], 24, "Name");
orm_addvar_string(orm, PlayerInfo[playerid][pPassword], 32, "Password");
orm_addvar_int(orm, PlayerInfo[playerid][pLevel], "Level");
orm_addvar_float(orm, PlayerInfo[playerid][pHealth], "Health");
orm_setkey(orm, "Name"); // устанавливаем ключ, в качесте него мы используем Имя игрока
orm_load(orm, "LoadPlayers", "d", playerid);
P.S. Конкретнее про функции ORM вы узнаете в следующем уроке

Теперь создадим функцию загрузки игрока:
forward LoadPlayers(playerid);
public LoadPlayers(playerid) 
{
   case ERROR_OK: ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "Введите Ваш пароль:", "Ок", "Выход");
   case ERROR_NO_DATA: ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Регистрация", "Придумайте Ваш будущий пароль:", "Ок", "Выход");
   return true;
}
Осталось совсем немного, переходим в public OnPlayerDisconnect и вставляем такую конструкцию:
if(Player[playerid][ID] != 0) orm_update(Player[playerid][ORM_ID]); // Обновляем данные игрока
orm_destroy(Player[playerid][ORM_ID]);  // Удаляем его ORM
for(new pInfo:i; i < pInfo; ++i)   // очищаем все переменные для будущих игроков (pInfo это наш enum, созданный выше. Мы перебираем из него все переменные и очищаем их)
PlayerInfo[playerid][i] = 0;

Ну вот, собственно, и все. Хотелось бы вернуть актуальность этому методу в наше время, т.к он более проще и нагляднее...
Об остальных функциях в более подробном разборе вы узнаете из следующего урока.
Так же скоро выйдет урок по созданию динамической системы на основе ORM-сценария, т.к. с этим у многих возникают проблемы.

Автор урока: W1nStoN

Edited by W1nStoN

Share this post


Link to post
Share on other sites

АВТОМАТИЧЕСКИ СФОРМИРОВАННОЕ СООБЩЕНИЕ:

Данная тема была перемещена модерацией или администрацией портала PAWNO-RUS.RU! 

Перемещена из: "Скриптинг PAWN > Готовые решения"

Перемещена в: "Скриптинг PAWN > Уроки"

 

С уважением, ваш Бот! 

Если вы НЕ согласны с переносом данной темы в раздел "Скриптинг PAWN > Уроки", пожалуйтесь на это сообщение в жалобе указав причины вашего недовольства. Спасибо. 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Dworkin
      By Dworkin
      Привет. Мне тяжело дается понимание строк в pawn из за не динамических массивов.
      #include enum pInfo { pRangName[25] } new players[MAX_PLAYERS][pInfo]; new string[20]; main() { format(string, sizeof(string), "Салага"); printf(string); players[0][pRangName] = string; } выдает ошибку "error 047: array sizes do not match, or destination array is too small" на строку "players[0][pRangName] = string;"
      Я понимаю что в ошибке говорится что размер не совпадает, но не могу понять как это сделать в павне
    • Ero33
      By Ero33
      Помогите решить проблему всё сделал, mysql подклучен но не открывается окно регистрациа ---------- Loaded log file: "server_log.txt". ---------- SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team [20:35:47] [20:35:47] Server Plugins [20:35:47] -------------- [20:35:47] Loading plugin: crashdetect.so [20:35:47] CrashDetect plugin 4.19.4 [20:35:47] Loaded. [20:35:47] Loading plugin: filemanager.so [20:35:47] ****************** [20:35:47] ** FILE MANAGER ** [20:35:47] ** Loaded ** [20:35:47] ** Version 1.5 ** [20:35:47] ****************** [20:35:47] Loaded. [20:35:47] Loading plugin: gvar.so [20:35:47] *** GVar Plugin v1.3 by Incognito loaded *** [20:35:47] Loaded. [20:35:47] Loading plugin: mysql.so [20:35:47] >> plugin.mysql: R41-4 successfully loaded. [20:35:47] Loaded. [20:35:47] Loading plugin: pawncmd.so [20:35:47] Pawn.CMD plugin v3.2.0 by urShadow has been loaded [20:35:47] Loaded. [20:35:47] Loading plugin: pawnraknet.so [20:35:47] [Pawn.RakNet] | Pawn.RakNet 1.4.1 | 2016 - 2020 |-------------------------------- | Author and maintainer: urShadow | Compiled: Jun 18 2020 at 11:28:17 |-------------------------------------------------------------- | Forum thread: https://forum.sa-mp.com/showthread.php?t=640306 |-------------------------------------------------------------- | Repository: https://github.com/urShadow/Pawn.RakNet |-------------------------------------------------------------- | Wiki: https://github.com/urShadow/Pawn.RakNet/wiki [20:35:47] Loaded. [20:35:47] Loading plugin: pawnregex.so [20:35:47] [Pawn.Regex] plugin v1.1.3 by urShadow loaded [20:35:47] Loaded. [20:35:47] Loading plugin: profiler.so [20:35:47] Profiler plugin 2.15.3 [20:35:47] Loaded. [20:35:47] Loading plugin: sscanf.so [20:35:47] [20:35:47] =============================== [20:35:47] sscanf plugin loaded. [20:35:47] Version: 2.8.3 [20:35:47] (c) 2018 Alex "Y_Less" Cole [20:35:47] =============================== [20:35:47] Loaded. [20:35:47] Loading plugin: streamer.so [20:35:47] *** Streamer Plugin v2.9.4 by Incognito loaded *** [20:35:47] Loaded. [20:35:47] Loading plugin: TOTP.so [20:35:47] TOTP plugin v1.0.1 by Games loaded. [20:35:47] Loaded. [20:35:47] Loaded 11 plugins. [20:35:47] [20:35:47] Filterscripts [20:35:47] --------------- [20:35:47] Loading filterscript 'rega_KYPE.amx'... [20:35:47] Loaded 1 filterscripts. [20:35:48] [20:35:48] -------------------------------------- [20:35:48] ������� Nex-AC ��������! [20:35:48] ������ ��������: 1.9.53 [20:35:48] �����: Nexius [20:35:48] -------------------------------------- [20:35:48] [�������� ...] �� MYSQL ������� ���������! (������ [��������] | 1) [20:35:48] [�������� ...] ��������� ������� �������� (0 ��.) [20:35:48] [�������� ...] �� ������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ���� ����/����� ������� �������� (0 ��.) [20:35:48] ����� � ���� �� ������� [20:35:48] [�������� ...] ���� ������� ��������� (0 ��.) [20:35:48] ������ � ���� �� ������� [20:35:48] [�������� ...] ����� ������� ��������� (0 ��.) [20:35:48] ��������� � ���� �� ������� [20:35:48] [�������� ...] ��������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ��������� ������� ��������� (0 ��.) [20:35:48] ����� � ���� �� ������� [20:35:48] [�������� ...] ����� ������� ��������� (0 ��.) [20:35:48] ������� � ������ � ���� �� ������� [20:35:48] [�������� ...] ������� � ����� ������� ��������� (0 ��.) [20:35:48] ���-�� ����'�� � ���� �� ��������� � �������������� ����������� [20:35:48] [�������� ...] ��������� �������� ������� ��������� (0 ��.) [20:35:48] �� ���������� func �������� � ���� [20:35:48] [�������� ...] ������� ������� ������� ��������� (0 ��.) [20:35:48] �� ���������� �������� � ���� [20:35:48] [�������� ...] ������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ������� ���� ������� ��������� (0 ��.) [20:35:48] [�������� ...] �������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ���������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ������� ������� �������� (0 ��.) [20:35:48] [�������� ...] ������ ����� ������� �������� (0 ��.) [20:35:48] [�������� ...] ����������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ��������� ������� ��������� [20:35:48] �� ���������� ATMS � ���� [20:35:48] [�������� ...] ��������� ������� ��������� (0 ��.) [20:35:48] [�������� ...] ����������� ��������� [20:35:48] [�������� ...] ������ ������� ������� ��������� [20:35:48] �������� �� ������� [20:35:48] [������� ...] ������������ ��������: (19832 ��.) [20:35:48] [������� ...] ����������� ��������: (120 ��.) [20:35:48] _______________________________________________________ [20:35:48] [20:35:48] dev by: glvde. | vk.com/way_dev [20:35:48] aurora project � 2021, inc. all rights reserved. [20:35:48] _______________________________________________________ [20:35:48] Number of vehicle models: 109 [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] SET CHARACTER SET 'utf8' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] SET NAMES 'utf8' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] SET character_set_client = 'cp1251' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] SET character_set_connection = 'cp1251' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] SET character_set_results = 'cp1251' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] SET SESSION collation_connection = 'utf8_general_ci' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] UPDATE `accounts` SET `online_status` = '1001' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] ALTER TABLE `accounts` ALTER `pCash` SET DEFAULT '0' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] ALTER TABLE `accounts` ALTER `pLevel` SET DEFAULT '0' [20:35:48] [OnQueryError] SQL ERROR. QUERY: [20:35:48] UPDATE `reports` SET `count` = '0' WHERE `id` = 1