.. _orm_genropy/orm_genropy/model: Il model di Genropy =================== .. toctree:: :maxdepth: 1 :hidden: :titlesonly: package table column/column.rst relation Il model di Genropy si basa su una `structure `_ che viene utilizzata per descrivere package, tabelle, colonne, relazioni, che lo sviluppatore desidera utilizzare nel db. Lo scopo di questa struttura è quello di **definire la composizione del db** che servirà sia per generare i comandi di config del db (vedi sezione dedicata alla `gnrdbsetup`_) sia per creare le query e le istruzioni SQL necessarie a interrogazioni e modifiche. Sarà quindi compito dello sviluppatore definire tutte le tabelle e le colonne e le relazioni utilizzando le chiamate opportune che saranno descritte nel corso del capitolo. Quando il sistema sarà avviato il motore dell’ORM provvederà, a partire dalla struttura così definita, a creare tutti gli :ref:`oggetti in memoria` che si occuperanno di generare i comandi SQL. La descrizione del model ------------------------ All'avvio di un'applicativo Genropy viene letto il file **instanceconfig.xml**, il file che contiene le impostazioni di configurazione dell’istanza di applicazione. Per ogni package indicato viene caricato l'elenco delle tabelle individuate all'interno della cartella ``model``, verrà costruita una `Bag `_ con le definizioni delle varie tabelle e questa Bag verrà passata a un *builder* che si occuperà della costruzione di tutti gli oggetti necessari. .. hint:: Si rimanda alla sezione :ref:`Structure e Object` e al `Corso Base di Genropy `_ per un ulteriore approfondimento su questi argomenti. La struttura segue sempre questa gerarchia Database packages package p1 tables table t1 columns column c1 column c2 ... column cn table t2 ... table tn package p2 ... package pn Seguendo questo schema, proviamo ad analizzare la struttura di un applicativo Genropy. Una volta istanziata un'applicazione, come abbiamo visto nell' :ref:`Introduzione` , all'interno dell'**oggetto database** possiamo vedere subito il **model**:: model = db.model Del model troviamo in ``src`` la Bag che corrisponde alla struttura dell'intero database:: model_structure = model.src Il primo livello della struttura è costituito dai :ref:`package` :: model_structure['packages'].keys() ['sys', 'adm', 'glbl', 'sandbox', 'tutor', 'test15', 'biz', 'fatt'] E più in profondità per ogni package troviamo le sue tabelle. Prendiamo ad esempio quelle del package *glbl*:: model_structure['packages.glbl.tables'].keys() ['comune', 'localita', 'nazione', 'nuts', 'provincia', 'regione'] Come abbiamo detto, questa è la `Bag `_ del model, ovvero la `struttura `_. Una volta costruita questa struttura, il builder dell'ORM si occuperà di trasformarla in una serie di oggetti necessari alla corretta "renderizzazione". Al centro c'è sempre la :ref:`Table` : :: model_structure['packages.glbl'].keys() ['tables'] All'interno della Table ci sono poi le :ref:`colonne` , suddivise tra colonne "reali" del record e :ref:`Colonne virtuali` . :: model_structure['packages.glbl.tables.provincia'].keys() ['columns', 'virtual_columns'] gnrdbsetup ********** Una volta costruito il model, e a ogni sua successiva modifica (sia essa a una :ref:`tabella ` , a una :ref:`colonna` , o a una :ref:`relazione` ), è necessaria un'operazione di creazione o riallineamento con il database. Genropy mette a disposizione per tale operazione un apposito script. In una finestra di terminale, con il comando:: gnrdbsetup nomeistanza verrà lanciato uno script che si occuperà di creare le tabelle e le colonne mancanti (o modificate dall’ultima esecuzione). La *gnrdbsetup* ha anche delle funzionalità addizionali: per esempio, eseguendo ``gnrdbsetup nomeistanza -u`` verranno creati anche i :ref:`sysRecord` di default delle tabelle. Per una lista completa delle opzioni disponibili, digita sul terminale *gnrdbsetup -h* .. hint:: Si noti che Genropy supporta diversi RDBMS (*SQLite, PostgreSQL, MySQL, Microsoft SQL*), ognuno dei quali può avere delle specificità di cui si dovrà tenere conto al lancio della gnrdbsetup e più in generale durante la gestione del progetto (SQLite, a mero titolo di esempio, presenta dei limiti nella gestione del comando ALTER TABLE). Si tenga presente che il sistema più collaudato e di conseguenza consigliato è `PostgreSQL `_. Vediamo ora come sono definite le singole componenti del Model di Genropy, partendo dal primo livello di questa struttura gerarchica: la :ref:`definizione di un package` . .. raw:: html
**Allegati:** - `Genropy ORM - Model (HTML) `_ - `Genropy ORM - Model (JNotebook).ipynb `_ .. sectionauthor:: Davide Paci