Per leggere il database l'oggetto table offre il metodo query che costruisce l'oggetto SqlQuery usando i parametri
Che vanno spezzare il classico statement SQL SELECT in blocchi. In ognuno dei blocchi possiamo far riferimento ai nomi dei campi o a delle variabili. I nomi dei campi passati nel parametro columns iniziano con $ se sono campi della tabella o con @ se sono campi in relazione.
Le variabili utilizzate nel parametro where iniziano sempre con : e si riferiscono a ulteriori parametri passati al metodo query.
from gnr.app.gnrapp import GnrApp
#istanzio oggetto GnrApp passando il nome dell'istanza di sandbox chiamata sandboxpg
app = GnrApp('sandboxpg')
#dell'oggetto GnrApp mi interessa al momento solo il puntatore all'oggetto GnrSqlDb
#questo è il mapper corrispondente dal database dell'applicazione
mydb = app.db
clienti_tbl = mydb.table('fatt.cliente')
Il metodo query restituisce un oggetto SqlQuery che viene instanziato con tutti i parametri passati dal metodo.
myquery = clienti_tbl.query(columns="$ragione_sociale",
where='$provincia = :prov',
order_by='$n_fatture',
prov='MI')
print (myquery.sqltext)
Il modo più rapido e semplice per ottenere il risultato della query è usando il metodo fetch che restituisce una lista di oggetti analoghi a dizionari.
myquery.fetch()
selezione = myquery.fetch()
selezione[0]['ragione_sociale']
Una delle peculiarità dell'ORM di Genropy è che propone di effettuare le query dal "punto di vista" di una table di partenza e di poter tuttavia accedere a tutti i campi del database che da quella tabella sono "raggiungibili" attraverso quello che chiamiamo path_relazionale.
Possiamo riferirci a colonne in relazione sia all'interno del parametro column che all'interno del parametro where. Il meccanismo di traduzione dell'ORM creerà le clausole di JOIN necessarie per leggere e testare queste colonne.
rel_query = clienti_tbl.query(columns='$ragione_sociale,@provincia.@regione.nome AS regione',
limit=5)
rel_query.fetch()
print (rel_query.sqltext)
rel_query2 = clienti_tbl.query(columns='$ragione_sociale, @provincia.@regione.nome AS regione',
where='@fatture.@righe.@prodotto_id.prezzo_unitario > :soglia_prezzo',
soglia_prezzo=200)
rel_query2.fetch()
Dall'oggetto SqlQuery ho disposizione altri metodi
second_query = clienti_tbl.query(columns='$ragione_sociale, $provincia, $email',
where='$email IS NOT NULL',
limit=10,
order_by='$ragione_sociale DESC')
dict_by_email = second_query.fetchAsDict(key='email')
dict_by_email
dict_by_email['giuseppe@verdi.it']
grouped_by_provincia = second_query.fetchGrouped(key='provincia')
grouped_by_provincia.keys()
grouped_by_provincia['LU']
grouped_by_provincia['MI']
tbl_cliente = mydb.table('fatt.cliente')
record_cliente = tbl_cliente.query(where='$id=:pkey',pkey='g8pa8wDvMIeQW0R8Chn6ZA').fetch()[0]
print (record_cliente)
r = tbl_cliente.record(pkey='g8pa8wDvMIeQW0R8Chn6ZA', virtual_columns='$etichetta')
dict_cliente = r.output('dict')
print (dict_cliente)
dict_cliente['indirizzo']
rec_cliente = tbl_cliente.record('ja14mgX2P2mRQWUNMWcdKg').output('bag')
rec_cliente.keys()
rec_cliente['@provincia.@comuni'].digest('#v.denominazione,#v.popolazione_residente')
bag_fatture = rec_cliente['@fatture']
bag_fatture.digest('#k,#a.totale_lordo,#v.totale_lordo')
missing = tbl_cliente.record('asodasda', ignoreMissing=True).output('dict')
print (missing)
mytuple = tbl_cliente.readColumns(where='$n_fatture>0',limit=1,order_by='$n_fatture DESC',
columns='$ragione_sociale,$n_fatture')
print (mytuple)
mytuple['ragione_sociale']