<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sqlx | www.valeriofinazzo.it</title>
	<atom:link href="http://www.valeriofinazzo.it/wordpress/tag/sqlx/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.valeriofinazzo.it/wordpress</link>
	<description>Il sito dell&#039;ingegnere Valerio Finazzo</description>
	<lastBuildDate>Fri, 30 Oct 2020 16:40:05 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.3</generator>
	<item>
		<title>TUTORIAL GO &#8211; GESTIONE DEL DATABASE</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 06 Sep 2020 17:05:49 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[database.sql]]></category>
		<category><![CDATA[godror]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[sqlx]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=630</guid>

					<description><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come integrare un database oracle e come effettuare le operazione di lettua e scrittura. Prima di tutto introduciamo il package per la gestione del db database/sql e insieme al package dobbiamo importare il driver specifico per il database cui connettersi. L&#8217;elenco dei driver disponibili e le relative basi di dati supportati &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; GESTIONE DEL DATABASE</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/">TUTORIAL GO – GESTIONE DEL DATABASE</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come integrare un database oracle e come effettuare le operazione di lettua e scrittura.</p>



<p>Prima di tutto introduciamo il package per la gestione del db database/sql e insieme al package dobbiamo importare il driver specifico per il database cui connettersi. L&#8217;elenco dei driver disponibili e le relative basi di dati supportati sono disponibili al link <a href="https://github.com/golang/go/wiki/SQLDrivers">https://github.com/golang/go/wiki/SQLDrivers</a>. Per lavoro uso Oracle, pertanto nell&#8217;esempio integro il driver godror. Per poter usare questo driver occorre installarlo e configurarlo nell&#8217;ambiente go tramite la direttiva:</p>



<pre class="crayon-plain-tag">go get github.com/godror/godror</pre>



<p>Il driver è realizzato in cgo pertanto è richiesta la presenza di un gcc compiler, nel mio caso ho utilizzato quello disponibile all&#8217;indirizzo <a href="https://jmeubank.github.io/tdm-gcc/">https://jmeubank.github.io/tdm-gcc/</a>. Maggiori informazioni su godror sono disponibili al l&#8217;url <a href="https://github.com/godror/godror">https://github.com/godror/godror</a></p>



<p>Dopo aver installato gcc e godror possiamo finalmente definire l&#8217;import</p>



<pre class="crayon-plain-tag">import (
	&quot;database/sql&quot;
	&quot;fmt&quot;
	_ &quot;github.com/godror/godror&quot;
)</pre>



<p>Per la connessione al db il comando da usare è Open del package db</p>



<pre class="crayon-plain-tag">db, err := sql.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}</pre>



<p>Il primo parametro della Open è il nome del driver e a seguire la stringa di connessione verso il db nel formato username@password@ip:port:sid</p>



<p>La funzione restituisce una istanza db e come secondo parametro un oggetto error che potrà essere gestito tramite la funzione panic.</p>



<p>Vediamo subito come effettuare una operazione di scrittura tramite la funzione Exec</p>



<pre class="crayon-plain-tag">tx, _ := db.Begin()
	rowsDeleted, err := db.Exec(&quot;delete from audit_obj where id=1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsDeleted: &quot;, rowsDeleted)

	rowsInserted, err := db.Exec(&quot;insert into audit_obj (id, dataora, operazione) values(1, sysdate, 'insert')&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsInserted: &quot;, rowsInserted)
	tx.Commit()</pre>



<p>Nell&#8217;esempio tramite la funzione Begin ho avviato una transazione con commit previsto a fine operazioni di scrittura. Nel caso specifico sto facendo la cancellazione di un record dalla tabella di audit e successivo inserimento  La funzione Exec ritorna un oggetto Result che rappresenta l&#8217;esito di una qualsiasi chiamata al db mostrando quante righe sono state coinvolte e l&#8217;id dell&#8217;ultimo inserimento.</p>



<p>Se volessi leggere i dati mi viene in aiuto la funzione Query che restituisce un cursore che scorre sulle righe selezionate</p>



<pre class="crayon-plain-tag">rows, err := db.Query(&quot;select id, dataora, operazione  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	defer rows.Close()

	var id int
	var dataora time.Time
	var operazione string
	for rows.Next() {
		rows.Scan(&amp;amp;id, &amp;amp;dataora, &amp;amp;operazione)
		fmt.Println(id, dataora, operazione)
	}
	db.Close()</pre>



<p>Nell&#8217;esempio sto leggenda dalla tabella audit tutti i record e tramite la funzione Scan dell&#8217;oggetto Rows la assegna a delle variabili per stamparne successivamente il valore. Con il comando defer chiudo il cursore alla fine di tutte le operazioni.</p>



<p>Per semplificare il lavoro con il db ci vengono in soccorso altri package che consentono di velocizzare il lavoro. Oggi introduco il package sqlx disponibile all&#8217;url <a href="https://jmoiron.github.io/sqlx/">https://jmoiron.github.io/sqlx/</a></p>



<p>Per installarlo il comando è</p>



<pre class="crayon-plain-tag">go get github.com/jmoiron/sqlx</pre>



<p>ad installazione effettuata può essere importato con la direttiva github.com/jmoiron/sqlx&#8221;. Questo package consente di mappare le query direttamente su struct senza dover ricorrere al comando Scan.</p>



<pre class="crayon-plain-tag">type Audit struct {
	ID      uint64    `db:&quot;ID&quot;`
	DATAORA time.Time `db:&quot;DATAORA&quot;`
}</pre>



<p>Ho definito una struct Audit che presenta i parametri ID e dataora, ne ho definito il tipo e tramite il thick ho definito il mapping, tramite la regola del contesto:nomecolonna.</p>



<p>A questo punto ottengo il gioco è fatto</p>



<pre class="crayon-plain-tag">dbx, err := sqlx.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}

	var audit Audit
	err = dbx.Get(&amp;amp;audit, &quot;select id, dataora from audit_obj where id = 1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audit)

	audits := []Audit{}
	dbx.Select(&amp;amp;audits, &quot;select id, dataora  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audits)</pre>



<p>Con la Open ottengo un riferimento al db che mi espone le funzioni Get per il recupero del singolo oggetto e Select per il recupero di un set di righe,</p>



<p>Alla prossima</p>



<p>ps. per i pigri a seguire l&#8217;intero codice</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;database/sql&quot;
	&quot;fmt&quot;
	&quot;time&quot;

	_ &quot;github.com/godror/godror&quot;
	&quot;github.com/jmoiron/sqlx&quot;
)

type Audit struct {
	ID      uint64    `db:&quot;ID&quot;`
	DATAORA time.Time `db:&quot;DATAORA&quot;`
}

func main() {

	fmt.Println(&quot;Start&quot;)

	db, err := sql.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}

	tx, _ := db.Begin()
	result, err := db.Exec(&quot;delete from audit_obj where id=1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsDeleted: &quot;, result)

	result, err = db.Exec(&quot;insert into audit_obj (id, dataora, operazione) values(1, sysdate, 'insert')&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(&quot;rowsInserted: &quot;, result)
	tx.Commit()

	rows, err := db.Query(&quot;select id, dataora, operazione  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	defer rows.Close()

	var id int
	var dataora time.Time
	var operazione string
	for rows.Next() {
		rows.Scan(&amp;amp;id, &amp;amp;dataora, &amp;amp;operazione)
		fmt.Println(id, dataora, operazione)
	}
	db.Close()

	dbx, err := sqlx.Open(&quot;godror&quot;, &quot;ldc/ldc@localhost:1521/xe&quot;)
	if err != nil {
		panic(err)
	}

	var audit Audit
	err = dbx.Get(&amp;amp;audit, &quot;select id, dataora from audit_obj where id = 1&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audit)

	audits := []Audit{}
	dbx.Select(&amp;amp;audits, &quot;select id, dataora  from audit_obj&quot;)
	if err != nil {
		panic(err)
	}
	fmt.Println(audits)

	dbx.Close()
	fmt.Println(&quot;End&quot;)

}</pre>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-gestione-del-database%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20GESTIONE%20DEL%20DATABASE" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/" data-a2a-title="TUTORIAL GO – GESTIONE DEL DATABASE"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-gestione-del-database/">TUTORIAL GO – GESTIONE DEL DATABASE</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
