.. _orm_genropy/orm_genropy/scrittura: Operazioni di scrittura ======================= .. toctree:: :maxdepth: 1 :hidden: :titlesonly: update delete valori_predefiniti Creare un nuovo record ---------------------- La :ref:`Tabella` implementa un metodo ``insert`` che riceve in modo polimorfico o un dizionario o una bag contenente i dati del nuovo record. :: nuovo_prodotto = dict(codice='TTFFG', descrizione='Prodotto Nuovo') tbl_prodotto.insert(nuovo_prodotto) mydb.commit() È quindi possibile passare al metodo *insert* un dizionario o una `Bag `_ con chiavi le :ref:`colonne` della tabella, e valori i valori del record che stiamo inserendo. .. hint:: Se guardiamo il record dopo il nuovo inserimento, noteremo che non sono state popolate solo le colonne da noi inserite, ma anche una serie di :ref:`Colonne di sistema` , ovviamente se presenti nella configurazione della Tabella. Si noti che è possibile passare nella ``insert`` anche la *primary key*, in quel caso verrà effettuato un check in merito all'esistenza o meno della *primary key* nel database. Se invece si utilizza l' :ref:`id di sistema` di Genropy e questo viene omesso, sarà l'ORM a invocare in autonomia il metodo :ref:`pkeyValue` per generare una nuova *primary key*:: print (nuovo_prodotto) {'codice': 'TTFFG', 'descrizione': 'Prodotto Nuovo', 'id': 'KCdaL3JIMful1fXF4mB11A', '__ins_ts': datetime.datetime(2020, 6, 10, 10, 22, 26, 483704), '__mod_ts': datetime.datetime(2020, 6, 10, 10, 22, 26, 483737), '__ins_user': None} .. hint:: Utilizzando il metodo ``raw_insert`` al posto del semplice ``insert`` sarà possibile eseguire l'operazione di creazione del record senza innescare i :ref:`Trigger` della tabella su cui si sta operando Il metodo newrecord ~~~~~~~~~~~~~~~~~~~ Genropy mette a disposizione una procedura alternativa alla procedura standard di inserimento di un dizionario o di una `Bag `_, il metodo ``newrecord``:: nuova_fattura = self.db.table('fatt.fattura').newrecord(data=self.db.workdate, cliente_id=cliente) self.db.table('fatt.fattura').insert(nuova_fattura) self.db.commit() Anche in questo caso il metodo ``newrecord`` crea un record nella tabella individuata, popolando automaticamente i *sysFields*. La differenza è che in questo caso verranno anche considerati i :ref:`valori predefiniti` , inoltre il *newrecord* generato avrà tutte le colonne del record, anche non precedentemente valorizzate. .. hint:: Se non valorizzate, le colonne del *newrecord* così creato esisteranno, e saranno uguali a *None*: possono quindi esserci differenze di comportamento in fase di inserimento di un record con questa metodologia rispetto a quanto avviene con dizionari e Bag, soprattutto in caso di meccanismi di controllo nei :ref:`Trigger` . commit ------ Al termine di una qualsiasi procedura di inserimento o di :ref:`modifica` di uno o più record è necessario procedere con il ``commit`` sul database, ovvero il momento in cui la transazione viene effettivamente eseguita e il record viene reso disponibile a tutti dopo la modifica sul database. In caso contrario la modifica rimarrà invece sul *client* e non sarà mai trasferita al database. :: self.db.commit() .. sectionauthor:: Davide Paci