Structure e Object

Partendo dalla definizione della struttura e delle caratteristiche che il model dell’applicativo Genropy deve avere, e che fa lo sviluppatore definendo classi e metodi all’interno di file Python, al momento dell’avvio dell’applicativo vengono istanziati dall’ORM di Genropy tutta una serie di oggetti che verranno utilizzati per operare con il database.

Viene quindi innanzitutto istanziato l” oggetto db , che contiene a sua volta l’oggetto model di Genropy , e che a sua volta contiene due istruzioni: src e obj.

src è un oggetto di tipo descrittivo che si occupa di compilare una Bag con la struttura degli oggetti, mentre obj è un oggetto di tipo operativo, ovvero l’oggetto su cui concretamente andremo ad effettuare le operazioni sul database .

È quindi possibile, ad esempio, osservare uno stesso package da due diverse prospettive:

model.src.package('adm')
<gnr.sql.gnrsqlmodel.DbModelSrc>

e:

model.obj['adm']
<gnr.sql.gnrsqlmodel.DbPackageObj object>

Lo stesso vale per la SqlTable, per la quale rimandiamo alla successiva sezione considerata la sua centralità nell’ORM di Genropy.

La parte «descrittiva» interviene nella primissima fase della costruzione, mentre la seconda, quella operativa, continuerà ad essere utilizzata dall’applicativo in tutte le operazioni.

_images/structure-e-object.jpg

Questo parallelismo tra una suddivisione tra un livello puramente descrittivo e uno operativo è quella che permette a Genropy di sfruttare a pieno le potenzialità in termini di customizzazione di un applicativo. Rispetto ad altri framework, in cui a essere definiti sono direttamente gli oggetti Python (package, table, columns, ecc) che verranno poi utilizzati, piuttosto che la loro descrizione, questa dicotomia consente a un package di Genropy, tramite un mix-in degli oggetti, di ridefinire in tutto o in parte un altro package, così elevando enormemente le possibilità di personalizzazione di un applicativo.

SqlTable

L’oggetto SqlTable è l’elemento centrale dell’ORM di Genropy, ma data la sua natura particolare è bene approfondire come esso venga definito ed istanziato.

Tramite la definizione della classe di mixin Table noi definiamo la table , descrivendone le sue proprietà SQL (nome, primary key), le colonne di cui si compone, le relazioni , i vincoli e gli indici.

L’istanza di applicazione in memoria carica l’intera struttura del database sotto forma di un oggetto gerarchico che contiene a sua volta gli oggetti descrittivi DbTableObj .

L’oggetto SqlTable, che viene istanziato dal metodo table, è quello che implementa tutte le funzioni di lettura e di scrittura da e sul database:

app = GnrApp('sandboxpg')
db = app.db
clienti_tbl = db.table('fatt.cliente')
<SqlTable 'fatt.cliente'>

All’interno dell’oggetto SqlTable sarà possibile individuare tutta una serie di attributi, tra i quali pkey, caption_field, name_long, name_plural, ovvero tutte le proprietà della table che abbiamo specificato nel modulo di model e tutti i metodi che abbiamo definito: oltre quindi a una serie di metodi built-in (API) comuni a tutte le tabelle (es: insert, update , query , e così via), conterrà anche tutti i metodi di mixin, ovvero tutti quei metodi che abbiamo definito all’interno della classe Table.

Suggerimento

È infatti prassi comune (e fortemente consigliata) dello sviluppo in Genropy la definizione di metodi all’interno della classe Table: in questo modo tali metodi saranno ampiamente disponibili all’interno dell’applicativo e facilmente individuabili all’interno dell’oggetto SqlTable.

L’altra faccia della medaglia dell’oggetto SqlTable è la sua parte «descrittiva», che ritroviamo nell’oggetto src:

db.model.src.table('cliente')

<gnr.sql.gnrsqlmodel.DbTableObj at 0x1035e57f0>

DbTableObj rappresenta la struttura della Table, che definisce cioè come la tabella è costruita in termini di colonne, colonne virtuali , relazioni e così via: è quindi la Bag contenente tutto ciò che è stato definito da noi nel metodo config_db.

DbTableObj è però solo un oggetto descrittivo in termini di struttura della nostra tabella. L’oggetto «attivo» che andremo ad utilizzare per le nostre Operazioni di lettura e scrittura è invece SqlTable, il «mapper» della table del database.

Lo schema seguente riassume la composizione della SqlTable:

_images/schemino-table.png

Qui in fondo è presente un file di ulteriore approfondimento degli oggetti trattati in formato Jupyter (eseguibile in modo attivo) o HTML.


Allegati:

Autore della sezione: Davide Paci