Configurarea Datelor
Introducere
Cu Netuno, dezvoltarea aplicațiilor trece mai întâi prin construirea bazei de date, prin construirea formularelor și câmpurilor.
Și când se lucrează în echipă sau este necesar să se transfere dezvoltarea aplicației într-un alt mediu, este necesar să se creeze o copie de siguranță a bazei de date împreună cu codul.
Astfel, la destinație va fi necesar să se reconfigureze baza de date și astfel aplicația va putea fi executată așa cum a fost dezvoltată la origine.
Problema acestui proces este efortul de a-ți aminti mereu să creezi o nouă copie de siguranță de fiecare dată când apare o modificare în baza de date. Și cu cât mai multe persoane sunt implicate în dezvoltare și/sau cu cât mai multe medii există pentru publicarea aplicației, cu atât acest proces devine mai complicat.
Așadar, Netuno, pentru a rezolva această problemă, aduce un sistem de setup al aplicațiilor, care generează automat structura bazei de date (schema) și, în plus, permite programarea manuală a încărcării datelor inițiale prin scripturi suplimentare.
De asemenea, permite schimbarea tipului de server de bază de date, garantând că setup-ul va fi executat în mod normal și aplicația fără nicio problemă. Aceasta înseamnă că aplicația poate fi dezvoltată în H2DataBase și, cu schemele generate automat, vei putea schimba conexiunea bazei de date a aplicației la PostgreSQL sau MariaDB. La prima execuție a aplicației pe noua bază de date, totul va fi reconstruit, indiferent de schimbarea tipului de server de bază de date.
Astfel, permite ca baza de date să fie complet schimbată fără a avea impact asupra dezvoltării deja realizate.
Fișierele de programare ale setup-ului se află în dosarul aplicației la:
server/setup
Configurarea Setup-ului
În configurațiile de mediu ale aplicațiilor care se află în:
/apps/APP_MEA/config/_development.json/apps/APP_MEA/config/_production.json
Vei putea manipula comportamentul 'setup-ului' prin configurațiile:
...
"setup": {
"enabled": true,
"schema": {
"auto_create": true,
"execution": true
},
"scripts": {
"execution": true
}
},
...
enabled: boolean > implicit true
Definește dacă setup-ul este activ sau nu și astfel activează sau dezactivează, la prima execuție a aplicației, execuția operațiilor de setup al datelor.
schema.auto_create: boolean > implicit true
Permite Netuno să știe dacă trebuie sau nu să genereze fișierele de schemă ale bazei de date ori de câte ori este creat sau modificat un formular sau un câmp.
schema.execution: boolean > implicit true
Controlează dacă schema trebuie executată sau nu în timpul operațiilor de setup realizate la prima execuție a aplicației.
scripts.execution: boolean > implicit true
Activează sau dezactivează execuția scripturilor suplimentare în timpul operațiilor de setup realizate la prima execuție a aplicației.
Schemă
În timpul creării sau modificării formularelor și câmpurilor în interfața web Netuno, vor fi generate fișierele de schemă în dosarul setup, după cum urmează:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
server/setup/_schema-NUME_FORMULAR.js
server/setup/_schema-NUME_FORMULAR.ts
server/setup/_schema-NUME_FORMULAR.py
server/setup/_schema-NUME_FORMULAR.rb
server/setup/_schema-NUME_FORMULAR.kts
server/setup/_schema-NUME_FORMULAR.groovy
Unde va exista un fișier _schema-*** pentru fiecare formular existent în aplicație.
Aceste fișiere nu trebuie modificate manual, deoarece sunt generate automat de Netuno.
Astfel, dacă modifici conținutul acestor fișiere, la următoarea generare a schemelor vor fi înlocuite automat, iar modificările făcute direct în fișiere vor fi pierdute.
Pentru ca generarea automată a schemei bazei de date să fie executată, trebuie să te asiguri că configurația schema.auto_create este activă și că dosarul setup există în dosarul server.
Scripturi
Scripturile de cod programate la comandă sunt fișiere aflate în dosarul setup care nu încep cu _.
Scopul principal al acestor scripturi este să încarce datele, garantând că baza de date conține informația minimă necesară pentru funcționarea corectă a aplicației.
Astfel, când aplicația va fi reconfigurată într-un alt mediu, va fi încărcată automat cu datele inițiale și va fi gata să înceapă utilizarea.
Pentru a realiza aceste operații de încărcare a datelor, va trebui să utilizezi funcțiile resursei _db.
Scripturile sunt executate după execuția schemelor, în ordine alfanumerică a numelui fișierelor care nu încep cu _.
Începerea numelui fișierelor cu o secvență numerică este ideală pentru a defini ordinea de execuție, așadar scripturile personalizate sunt executate în ordinea numelui fișierelor care nu încep cu
_.
Inserarea Datelor Personalizate
Și, pentru a economisi efortul de a face interogări în baza de date pentru a verifica dacă se poate face sau nu inserarea de date, Netuno oferă funcția insertIfNotExists.
Această funcție verifică dacă există datele exact așa cum sunt definite în baza de date; dacă nu există, atunci realizează crearea lor.
Un exemplu de utilizare a sa va fi încărcarea câmpurilor Cod și Nume din formularul Tip de Teritoriu, unde numele tabelului este tip_teritoriu și are coloanele cod și nume; pentru aceasta va fi suficient să creezi fișierul cu următorul conținut:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1001")
.set("nume", "Continental")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1002")
.set("nume", "Arhipelagic")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "2003")
.set("nume", "Maritim")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "3004")
.set("nume", "Aerian")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1001")
.set("nume", "Continental")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1002")
.set("nume", "Arhipelagic")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "2003")
.set("nume", "Maritim")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "3004")
.set("nume", "Aerian")
);
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1001")
.set("nume", "Continental")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1002")
.set("nume", "Arhipelagic")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "2003")
.set("nume", "Maritim")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "3004")
.set("nume", "Aerian")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1001")
.set("nume", "Continental")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1002")
.set("nume", "Arhipelagic")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "2003")
.set("nume", "Maritim")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "3004")
.set("nume", "Aerian")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1001")
.set("nume", "Continental")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1002")
.set("nume", "Arhipelagic")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "2003")
.set("nume", "Maritim")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "3004")
.set("nume", "Aerian")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1001")
.set("nume", "Continental")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "1002")
.set("nume", "Arhipelagic")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "2003")
.set("nume", "Maritim")
)
_db.insertIfNotExists("tip_teritoriu", _val.map()
.set("cod", "3004")
.set("nume", "Aerian")
)
Ciclul de Procesare
După cum s-a explicat deja, setup-ul este executat doar la prima execuție a aplicației.
Iar ordinea de execuție este:
_start- execută fișierul de inițializare care poate conține orice tip de programare personalizată:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
APP_MEA/server/setup/_start.js
APP_MEA/server/setup/_start.ts
APP_MEA/server/setup/_start.py
APP_MEA/server/setup/_start.rb
APP_MEA/server/setup/_start.kts
APP_MEA/server/setup/_start.groovy
_cleanup- execută eliminarea formularelor, rapoartelor și câmpurilor respective în mod programatic:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
APP_MEA/server/setup/_cleanup.js
APP_MEA/server/setup/_cleanup.ts
APP_MEA/server/setup/_cleanup.py
APP_MEA/server/setup/_cleanup.rb
APP_MEA/server/setup/_cleanup.kts
APP_MEA/server/setup/_cleanup.groovy
_schema-*- execută toate scripturile cu prefixul _schema-, conține comenzile de creare a formularelor, rapoartelor și câmpurilor respective:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
APP_MEA/server/setup/_schema-structura_autogenerata.jsAPP_MEA/server/setup/_schema-categorie.jsAPP_MEA/server/setup/_schema-produs.jsAPP_MEA/server/setup/_schema-client.js
APP_MEA/server/setup/_schema-structura_autogenerata.tsAPP_MEA/server/setup/_schema-categorie.tsAPP_MEA/server/setup/_schema-produs.tsAPP_MEA/server/setup/_schema-client.ts
APP_MEA/server/setup/_schema-structura_autogenerata.pyAPP_MEA/server/setup/_schema-categorie.pyAPP_MEA/server/setup/_schema-produs.pyAPP_MEA/server/setup/_schema-client.py
APP_MEA/server/setup/_schema-structura_autogenerata.rbAPP_MEA/server/setup/_schema-categorie.rbAPP_MEA/server/setup/_schema-produs.rbAPP_MEA/server/setup/_schema-client.rb
APP_MEA/server/setup/_schema-structura_autogenerata.ktsAPP_MEA/server/setup/_schema-categorie.ktsAPP_MEA/server/setup/_schema-produs.ktsAPP_MEA/server/setup/_schema-client.kts
APP_MEA/server/setup/_schema-structura_autogenerata.groovyAPP_MEA/server/setup/_schema-categorie.groovyAPP_MEA/server/setup/_schema-produs.groovyAPP_MEA/server/setup/_schema-client.groovy
001-alte_scripturi- execută fișierele de scripturi programate la comandă, sunt toate fișierele care nu încep cu_și care probabil vor conține inserările de date inițiale necesare sau alte dezvoltări personalizate, de exemplu:- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
APP_MEA/server/setup/001-insereaza_date_personalizate.jsAPP_MEA/server/setup/002-categorie.jsAPP_MEA/server/setup/003-produs.jsAPP_MEA/server/setup/004-client.js
APP_MEA/server/setup/001-insereaza_date_personalizate.tsAPP_MEA/server/setup/002-categorie.tsAPP_MEA/server/setup/003-produs.tsAPP_MEA/server/setup/004-client.ts
APP_MEA/server/setup/001-insereaza_date_personalizate.pyAPP_MEA/server/setup/002-categorie.pyAPP_MEA/server/setup/003-produs.pyAPP_MEA/server/setup/004-client.py
APP_MEA/server/setup/001-insereaza_date_personalizate.rbAPP_MEA/server/setup/002-categorie.rbAPP_MEA/server/setup/003-produs.rbAPP_MEA/server/setup/004-client.rb
APP_MEA/server/setup/001-insereaza_date_personalizate.ktsAPP_MEA/server/setup/002-categorie.ktsAPP_MEA/server/setup/003-produs.ktsAPP_MEA/server/setup/004-client.kts
APP_MEA/server/setup/001-insereaza_date_personalizate.groovyAPP_MEA/server/setup/002-categorie.groovyAPP_MEA/server/setup/003-produs.groovyAPP_MEA/server/setup/004-client.groovy
- _end - execută fișierul de finalizare care poate conține orice tip de programare personalizată:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
APP_MEA/server/setup/_end.js
APP_MEA/server/setup/_end.ts
APP_MEA/server/setup/_end.py
APP_MEA/server/setup/_end.rb
APP_MEA/server/setup/_end.kts
APP_MEA/server/setup/_end.groovy
Adică este permisă crearea de cod la comandă în scripturile start și end pentru a realiza unele operații care are sens să fie executate înainte de setup sau chiar când acesta este finalizat.
Este bine să reamintim că acest ciclu de procesare este executat de fiecare dată când aplicația este executată pentru prima dată, de aceea este necesar să se garanteze verificarea existenței datelor înainte de a realiza crearea lor.
Asigură-te că următoarele configurații de mediu sunt active pentru a permite execuția acestui proces în fișierele APP_MEA/config/_development.json sau APP_MEA/config/_production.json, în funcție de mediu:
-
Activează sau dezactivează complet execuția oricărei operații de setup:
setup.enabled = true|false -
Activează sau dezactivează execuția _schemelor-:
setup.schema.execution = true|false -
Activează sau dezactivează execuția scripturilor:
setup.scripts.execution = true|false
Curățare
Pentru a programa eliminarea formularelor și câmpurilor, trebuie să utilizăm scriptul _cleanup.js, ceea ce garantează că, în toate mediile care sincronizează fișierele proiectului, la execuția setup-ului structura va fi eliminată, dacă există.
Exemplu de script de curățare:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Elimină formularul zona:
_form.dropIfExists("zona");
// Elimină câmpul subarie_id din formularul arie:
_form.dropFieldIfExists("arie", "subarie_id");
// Elimină formularul zona:
_form.dropIfExists("zona");
// Elimină câmpul subarie_id din formularul arie:
_form.dropFieldIfExists("arie", "subarie_id");
# Elimină formularul zona:
_form.dropIfExists("zona")
# Elimină câmpul subarie_id din formularul arie:
_form.dropFieldIfExists("arie", "subarie_id")
# Elimină formularul zona:
_form.dropIfExists("zona")
# Elimină câmpul subarie_id din formularul arie:
_form.dropFieldIfExists("arie", "subarie_id")
// Elimină formularul zona:
_form.dropIfExists("zona")
// Elimină câmpul subarie_id din formularul arie:
_form.dropFieldIfExists("arie", "subarie_id")
// Elimină formularul zona:
_form.dropIfExists("zona")
// Elimină câmpul subarie_id din formularul arie:
_form.dropFieldIfExists("arie", "subarie_id")
DBML
De fiecare dată când Netuno execută setup-ul datelor, este generat fișierul:
server/setup/_db-schema.dbml
Acesta este fișierul cu întreaga structură de date care poate fi utilizat cu Inteligență Artificială.
Pe baza conținutului DBML, Inteligența Artificială înțelege structura de date și poate genera interogări SQL precise.
Încearcă să utilizezi acest fișier ca atașament în prompt și cere să generezi interogări SQL complexe; vei obține rezultate bune.
Concluzie
Procesul de setup al aplicațiilor în Netuno are ca principale funcții:
- _schema-: generează automat întreaga structură de formulare și rapoarte cu câmpurile lor respective, care permit garantarea întregii coerențe a structurii bazei de date a aplicației, în special când aplicația este executată cu o nouă bază de date goală.
- scripturi: realizează operații de bază de date pentru a garanta că aplicația conține datele obligatorii preîncărcate anterior de fiecare dată când este executată pentru prima dată.
În acest fel, Netuno permite ca aplicațiile să funcționeze în medii noi, chiar dacă se schimbă tipul bazei de date, garantând funcționarea corectă a aplicației fără necesitatea de a realiza copii de siguranță și restaurare ale bazelor de date.
Permițând în plus ca tot codul de configurare generat automat și manual să fie versionat cu GIT, de exemplu.