<?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>SIMOTRONE WEB PAGE &#187; DBI</title>
	<atom:link href="http://www.simotrone.it/tag/dbi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simotrone.it</link>
	<description>Simotrone is back!</description>
	<lastBuildDate>Fri, 30 Jul 2010 05:47:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Database drivers</title>
		<link>http://www.simotrone.it/2009/12/03/database-drivers/</link>
		<comments>http://www.simotrone.it/2009/12/03/database-drivers/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 06:31:22 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2494</guid>
		<description><![CDATA[E&#8217; un periodo in cui sto lavorando molto con perl e database differenti.
Ho già parlato del modulo DBI, e di quanto esso mi gusti.
Se per caso servisse sapere quali driver DBI mette a disposizione, ecco l&#8217;elenco dei database a cui è possibile collegarsi.  

sim@idrogeno:~$ perl -MDBI -e &#8216;@drivers = DBI-&#62;available_drivers; map { print &#34;$_\n&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>E&#8217; un periodo in cui sto lavorando molto con perl e database differenti.<br />
Ho già parlato del modulo <a href="http://www.simotrone.it/?s=DBI">DBI</a>, e di quanto esso mi gusti.</p>
<p>Se per caso servisse sapere quali driver DBI mette a disposizione, ecco l&#8217;elenco dei database a cui è possibile collegarsi. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim<span class="re0">@idrogeno</span>:~$ perl -MDBI -e <span class="st0">&#8216;@drivers = DBI-&gt;available_drivers; map { print &quot;$_\n&quot; } @drivers&#8217;</span><br />
AnyData<br />
CSV<br />
DBM<br />
ExampleP<br />
File<br />
Gofer<br />
Pg<br />
Proxy<br />
SQLite<br />
Sponge<br />
mysql</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/12/03/database-drivers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBIx::Simple</title>
		<link>http://www.simotrone.it/2009/06/05/dbixsimple/</link>
		<comments>http://www.simotrone.it/2009/06/05/dbixsimple/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 06:25:22 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[DBIx::Simple]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1915</guid>
		<description><![CDATA[Nel delirio perlico che ogni tanto mi prende, mi sono messo a guardare un po&#8217; di codice che richiedeva un differente approccio per collegarsi ai db.
Devo dire che sono rimasto schifosamente affascinato da DBIx::Class e il suo &#8220;Schema&#8221;, ma non avendoci ancora capito molto, aspetto a scriverci su qualcosa.
Di sicuro invece c&#8217;è che DBIx::Simple funziona. [...]]]></description>
			<content:encoded><![CDATA[<p>Nel delirio <em>perlico</em> che ogni tanto mi prende, mi sono messo a guardare un po&#8217; di codice che richiedeva un differente approccio per collegarsi ai db.<br />
Devo dire che sono rimasto schifosamente affascinato da DBIx::Class e il suo &#8220;Schema&#8221;, ma non avendoci ancora capito molto, aspetto a scriverci su qualcosa.</p>
<p>Di sicuro invece c&#8217;è che <a href="http://search.cpan.org/~juerd/DBIx-Simple-1.32/lib/DBIx/Simple.pm">DBIx::Simple</a> funziona. Non ho ben capito perchè dovrebbe essere più semplice di <a href="http://search.cpan.org/~timb/DBI/DBI.pm">DBI</a>, però&#8230; funziona.</p>
<p><strong>DBI</strong>, come ho già scritto in passato, funge così: si carica l&#8217;handler, si prepara la query, la si esegue e si fetcha il risultato nella maniera che si ritiene più opportuna. (*)</p>
<pre>use DBI;
my $dsn = "dbi:mysql:database=test";
my $dbh = DBI-&gt;connect( $dsn, $username, $password )
        or die $DBI::errstr;
my $sth = $dbh-&gt;prepare("SELECT * FROM testing")
        or die $dbh-&gt;errstr;
$sth-&gt;execute();
while ( my $row = $sth-&gt;fetchrow_hashref() )
{ ... }</pre>
<p>Il vantaggio con <strong>DBIx::Simple</strong> è che <strong>prepare()</strong> ed <strong>execute()</strong> sono compresi in un&#8217;unica chiamata. Il <a href="http://search.cpan.org/~juerd/DBIx-Simple-1.32/lib/DBIx/Simple/Examples.pod#Fetching_one_row_at_a_time">fetching dei risultati</a> dovrebbe essere un po&#8217; semplificato, ma a me non ha cambiato la vita (i metodi sono al paragrafo <a href="http://search.cpan.org/~juerd/DBIx-Simple-1.32/lib/DBIx/Simple.pm#DBIx::Simple::Result_methods">DBIx::Simple::Result methods</a>).</p>
<pre>use DBIx::Simple;
my $dbh = DBIx::Simple-&gt;connect('dbi:Pg:dbname=test',
        'username', 'password' ) or die DBIx::Simple-&gt;error;
my $res = $dbh-&gt;query('SELECT * FROM pluto');
while ( $res->into(my($id, $ti, $ra)) ) {
              say "$id $ti $ra";
}</pre>
<p><strong>Nota:</strong> L&#8217;idea del metodo html per ottenere una tabella HTML dal risultato l&#8217;ho trovata simpatica.</p>
<hr/>
(*) Attualmente il modo più comodo che ho trovato per fare le chiamate è passando attraverso una subroutine che si mangia l&#8217;handler e la query come argomenti:</p>
<pre>sub sql_query {
        my ($dbh,$query) = @_;
        my $result = $dbh-&gt;prepare($query)
                or print("Failed to set up query: $query\n");
        $result-&gt;execute()
                or print("Failed to exec query: $query\n");
        return $result;
}
...
my $dbh = DBI-&gt;connect(...)
$risultato = sql_query($dbh, "SELECT * FROM pippo");
while ( my @riga = $risultato-&gt;fetchrow_array ) { ... }</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/06/05/dbixsimple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modulo DBI (2)</title>
		<link>http://www.simotrone.it/2009/04/24/modulo-dbi-2/</link>
		<comments>http://www.simotrone.it/2009/04/24/modulo-dbi-2/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 18:04:01 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[placeholder]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1037</guid>
		<description><![CDATA[Tempo addietro ho parlato del bellissimo DBI di perl, ma non ho parlato dei placeholder.
Dunque ho rispolverato questo post di inizio dicembre 2008, così da aver almeno un paio di note about them.
use DBI;

my $dbh = DBI->connect("dbi:mysql:dbname","user","passwd")
     or die("Couldn't connect to db");

La query puo&#8217; essere scritta normalmente come $variabile = &#8216;SELECT [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.simotrone.it/2008/12/13/modulo-dbi/">Tempo addietro</a> ho parlato del bellissimo DBI di perl, ma non ho parlato dei placeholder.<br />
Dunque ho rispolverato questo post di inizio dicembre 2008, così da aver almeno un paio di note about them.</p>
<pre>use DBI;

my $dbh = DBI->connect("dbi:mysql:dbname","user","passwd")
     or die("Couldn't connect to db");
</pre>
<p>La query puo&#8217; essere scritta normalmente come $variabile = &#8216;SELECT bla FROM blabla [...]&#8216; oppure manipolata in maniera piu&#8217; interessante come segue:</p>
<pre>my @columns = qw(id name surname birth notes);
my $query_ins = "INSERT INTO table (".
                join(", ", @columns).
                ") VALUES (".
                join(", ", map {"?"} @columns).
                ")";
</pre>
<p>Che equivale ad un INSERT INTO table (id, name, surname, birth, notes) VALUES (?, ?, ?, ?, ?);</p>
<p>I punti interrogativi (?) sono i cosiddetti placeholder, che permettono di inserire singoli parametri molto comodamente. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/04/24/modulo-dbi-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modulo DBI</title>
		<link>http://www.simotrone.it/2008/12/13/modulo-dbi/</link>
		<comments>http://www.simotrone.it/2008/12/13/modulo-dbi/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 05:20:43 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1042</guid>
		<description><![CDATA[Perl fa tante cose belle&#8230; fra le altre ha un bellissimo modulo che gestisce l&#8217;interazione coi database: questo modulo si chiama DBI.
In un programma tipico vediamo la chiamata al modulo, l&#8217;impostazione del database handler ($dbh) e dello statement handler ($sth), la query ($sql), poi la preparazione e l&#8217;esecuzione della query.
#!/usr/bin/perl

use DBI;

my $dbh = DBI->connect("dbi:mysql:dbname","user","passwd")
  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.perl.org/">Perl</a> fa tante cose belle&#8230; fra le altre ha un bellissimo modulo che gestisce l&#8217;interazione coi database: questo modulo si chiama <a href="http://search.cpan.org/~timb/DBI-1.607/DBI.pm">DBI</a>.<br />
In un programma tipico vediamo la chiamata al modulo, l&#8217;impostazione del database handler ($dbh) e dello statement handler ($sth), la query ($sql), poi la preparazione e l&#8217;esecuzione della query.</p>
<pre>#!/usr/bin/perl

use DBI;

my $dbh = DBI->connect("dbi:mysql:dbname","user","passwd")
     or die("Couldn't connect to db: ".$DBI::errstr);

my $sql = "SELECT id,name,surname FROM table";

my $sth = $dbh->prepare($sql)
     or die("Couldn't prepare statement: ".$dbh->errstr);

$sth->execute();
</pre>
<hr/>
La cosa molto interessante, a mio avviso, è che Perl offre moltissimi modi per fetchare i dati dall&#8217;oggetto scaricato dal db.</p>
<p>1) <strong>fetchrow_array</strong>, questo metodo copia i dati dal db all&#8217;array @row e poi li manipola intervenendo sull&#8217;array.</p>
<pre>while ( my @row = $sth->fetchrow_array() )
{
        print("$row[0]\t$row[1]\t$row[2]\n");
}</pre>
<p>2) <strong>fetchrow_arrayref</strong>, questo metodo crea un riferimento numerico al record nel db.</p>
<pre>while ( my $row = $sth->fetchrow_hashref() )
{
        print("$row->[0]\t$row->[1]\t$row->[2]\n");
}</pre>
<p>3) <strong>fetchrow_hashref</strong>, questo metodo crea un riferimento associativo al record nel db.</p>
<pre>while ( my $row = $sth->fetchrow_hashref() )
{
        print("$row->{id}\t$row->{name}\t$row->{surname}\n");
}</pre>
<p>4) <strong>fetchall_arrayref</strong>, questo metodo è molto interessante perche&#8217; permette di manipolare tutti i record attraverso le reference di un array di reference. (I dati si possono mischiare, scambiando i riferimenti dell&#8217;array di riferimento.)</p>
<pre>my $row = $sth->fetchall_arrayref();
# stampano i 3 dati del primo [0] e del secondo [1] record
        print("$row->[0]->[0]\t$row->[0]->[1]\t$row->[0]->[2]\n");
        print("$row->[1]->[0]\t$row->[1]->[1]\t$row->[1]->[2]\n");
# stampa il primo dato del primo record, il secondo dato del secondo
# record, ed il terzo dato del terzo record.
        print("$row->[0]->[0]\t$row->[1]->[1]\t$row->[2]->[2]\n");
</pre>
<p>5) <strong>bind_columns / fetch</strong></p>
<pre>my( $id, $name, $surname );
$sth->bind_columns( \$id, \$name, \$surname );
while ($sth->fetch())
{
        print("$id\t$name $surname\n");
}
</pre>
<hr/>
Info sparse online:</p>
<ul>
<li><a href="http://search.cpan.org/~timb/DBI-1.607/DBI.pm">CPAN: DBI.pm</li>
<li><a href="http://www.infocopter.com/perl/dbi-bind-columns.htm">DBI bind columns</a></li>
<li><a href="http://www.saturn5.com/~jwb/dbi-examples.html">Perl DBI Example</a></li>
<li><a href="http://www.perl.it/documenti/talks/ipw/2004/gmax/IPW_idiomi_DBI.pdf">Idiomi del DBI di Giuseppe Maxia [pdf]</a></li>
<li><a href="http://www.perlmeme.org/tutorials/connect_to_db.html">Perlmeme: connecto to db</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2008/12/13/modulo-dbi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
