Configurazione Database

Configurazione in genropy di un Database

Come ogni framework moderno che si rispetti, genropy gestisce in modo molto avanzato l'accesso ad una grande quantità di dati e l'elaborazione degli stessi in tempo reale.

È stata sviluppata anche un vero e proprio gestionale di tipo ERP con genropy, il cui nome è Erpy.

Da decenni, il modo più consono per gestire grosse moli di dati è di fare uso di database.

La gestione dei database è demandata a particolari motori software (solitamente chiamati engine), che hanno caratteristiche diverse e ogni engine si porta dietro le proprie particolarità (il termine database relazionali è solo un esempio di queste particolarità).

Genropy non ha un engine proprio, ma può utilizzare qualsiasi engine che si trova nel mondo informatico per cui sia stato scritto un particolare "interprete", denominato in gergo adapter, il suo scopo è quello di tradurre uno schema dei comandi di genropy nelle diverse interpretazioni che sono particolari per ogni engine.

Nei prossimi paragrafi affronteremo l'integrazione nel framework genropy dei diversi engine.

Attualmente sono supportati i seguenti engine: SQLite , PostgreSQL , MySQL , MISSING LINK (install/db_configuration/msql) Microsoft SQL e Oracle .

Ricordiamo che in caso di necessità, altri engine possono essere supportati, se qualcuno scrive il relativo adapter e il driver di interfacciamento python all'engine.

Hint

Come buona pratica consigliamo di inserire in un unico punto la definizione dell'engine che verrà utilizzato come default con le eventuali credenziali per l'accesso. Questa definizione sarà utilizzata per creare i DB usati nelle diverse istanze di genropy.

Se si sta utilizzando una installazione standard il posto menzionato è il file:

~/.gnr/instanceconfig/default.xml

mentre se si fa riferimento ad una installazione che usa virtualenv:

<directory virtualenv>/etc/gnr/instanceconfig/default.xml

in questo file xml bisogna creare una direttiva contenente i dati di accesso all'engine, nell'esempio seguente facciamo riferimento ad una installazione che userà di default PostgreSQL come engine.

<db implementation="postgres" user="usr" password="pwd"/>

Naturalmente poi ogni istanza dovrà essere personalizzata con il nome del DB da usare e questa personalizzazione la inseriremo nel file instanceconfig.xml dell'istanza stessa.

Hint

Per spiegare cosa avviene quando si utilizza questo modo di operare con genropy, bisogna fare riferimento alle Bag . Nella documentazione linkata, avete tutta la definizione e gli esempi, in questo contesto basta sapere che dal file default.xml viene generata una rappresentazione nella struttura dati della Bag, il grosso vantaggio di questa struttura dati, è che può essere aggiornata, ampliata, modificata in ogni sua parte in modo dinamico con le API interne di genropy. Quindi viene creata una Bag contenente la definizione dell'accesso al database dal file default.xml (tipo di engine e credenziali di accesso), questa Bag, succesivamente all'esecuzione di una particolare istanza, viene aggiornata con i dati del suo instanceconfig.xml (generalmente il nome del DB).

Nulla vieta che nella istanza venga definito anche un engine completamente diverso dal default o credenziali diverse.

Hint

Una conseguenza di avere un DB con un engine che mette esternamente al progetto tutti i dati, comporta che quando il progetto viene condiviso (per distribuirlo o per lo sviluppo, i dati non seguano automaticamente il progetto stesso. Cosa che, se durante lo sviluppo potrebbe essere una apparente perdita di tempo, quando invece si deve distribuire il prorio codice ad estranei, siamo sicuri che non c'é una involontaria condivisione di dati, magari anche sensibili.

In situazioni particolari (come nella sandbox di genropy), si può utilizzare SQLite, che, non usando un engine di sistema, salva i dati in un unico file all'interno della directory del progetto stesso (in base al suo instanceconfig.xml). Questo significa che questi dati saranno sempre distribuiti con il progetto, ogni volta che lo stesso è condiviso con altri utenti.