SA-MP Database migration (Flyway-DB like)

Započeo Slade, Maj 30, 2023, 00:02:28 PRE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Tip: Include
Slike ili Video: Ispod
Opis i dodatne informacije: Ispod.
Download link: https://github.com/daniscavalic/samp-database-migration
Scan link: repo
Credits: Danis Cavalic (Slade), pBlueG and team (MySQL), JaTochNietDan (FileManager), ostali koji su pomagali u razvijanju prethodno pomenuta dva plugina.


Već dugo generalno koristim SQL, i iskreno dosadilo mi je konstantno executeovati query i na remote mašini, nakon što ga executeujem lokalno, da bi imao up-to-date infrastrukturu baze kako lokalno tako i remotely. U javi sam koristio flyway db za migriranje, i skontao sam da SA-MP nema database manager, pa sam napisao jedan jednostavan library, prije svega zbog sebe, pa evo i da ga objavim, koji ce vrsiti redom migracije po verzijama, slicno kao Flyway (buduci da je samo include, nije moguce napraviti bas identicno, a da ne bude milion nekih nepotrebnih provjera). Short story long, ovaj include vam omogucava da dakle imate automatsku migraciju baze prilikom pokretanja servera.


Migracije se nalaze u folderu: scriptfiles/schemas/
Format fajla mora biti: V{verzija}_{naziv_migracije}.sql


Vazno za napomenuti:
- Migracije NE SMIJU IMATI istu verziju.
- Kao i na Flywayu, library sprema checksum fajla, i samim time nije dozvoljeno mjenjati fajl migracije nakon sto je ona izvrsena, napisite novu, jer u slucaju invalid checksuma, samo ce tu stati proces migracije, zbog sigurnosti infrastrukture vase baze.
- Migracije moraju ici po redu, dakle: 2-3-4-5-6, bez preskakanja brojeva. U slucaju da napravite 5 migracija, i iduca vam je broj 8, nakon 5-te petlja nece naci 6-tu i misliti ce da je izvrsila sve migracije.
- Prvi put kada ubacite include i sve setupujete, server ce pri prvom pokretanju napraviti schemas folder, .sql fajl inicijalne migracije koja ce napraviti tabelu u vasoj bazi koja memorise migracije, i samim time i sama sebe upisati kao prva migracija.


Za sve sto sam zaboravio pomenuti, mozete provjeriti na repozitoriju, imate example usage, i moguce neke korake koje sam zaboravio ovdje napisati.
Prakticno, usage je, da dodate odmah ispod funkcije za konekciju MigrateSchemas funkciju, example:
[pawn]#include <database_migration>

new MySQL: Database;

hook OnGameModeInit()
{
    new MySQLOpt: option_id = mysql_init_options();
    mysql_set_option(option_id, AUTO_RECONNECT, true);
    Database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE, option_id);
    if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0) {
        SendRconCommand("exit");
        return 1;
    }

    MigrateSchemas(Database);
   
    return Y_HOOKS_CONTINUE_RETURN_1;
}[/pawn]
Note: Funkcija ima i debugMigration parametar, koji je po defaultu false, kao drugi parametar posaljite true za detaljne logove.



Tabela u bazi:
(note: query-i kao sto mozete vidjeti po checksumu su duplikati (5-11), samo radi testiranja).

Server-Log:

Primjer schemas foldera sa 11 migracija:



Nazalost, zbog cinjenice da je ovo include, a ne plugin, ima negdje sigurno i losih praksi, ali su neophodne da include funkcionise. Ako neko ima ideja kako unaprijediti isti, napisite, ili jos bolje, otvorite PR sa fixom  :D.


Slade osto jedan od jacih :D

TIIIIIRRRRRRUUUUUU RIIIIIIIIIIIIIIIII RUUUUUUUUUUUUU