<?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; Search Results  &#187;  DBI</title>
	<atom:link href="http://www.simotrone.it/search/DBI/feed/rss2/" rel="self" type="application/rss+xml" />
	<link>http://www.simotrone.it</link>
	<description>Simotrone is always here!</description>
	<lastBuildDate>Sat, 04 Feb 2012 18:30:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>DBIC-&gt;create e relazioni</title>
		<link>http://www.simotrone.it/2011/11/02/dbic-create-e-relazioni/</link>
		<comments>http://www.simotrone.it/2011/11/02/dbic-create-e-relazioni/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 06:25:00 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBIx::Class]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=3607</guid>
		<description><![CDATA[Ho già parlato di DBIx::Class. Avendo result source con relazioni si possono ottenere risultati interessanti. Esistono gli oggetti Folk ed Email, ove l&#8217;oggetto Folk sia in relazione con molteplici oggetti Email (folk has_many emails). package My::Schema::Result::Folk; &#91;&#8230;&#93; __PACKAGE__-&#62;has_many&#40;&#8216;emails&#8217;,&#8216;My::Schema::Result::Email&#8217;,&#8216;id&#8217;&#41;; E&#8217; possibile creare un record scrivendo i dati dell&#8217;oggetto/i relativo/i in un arrayref. my $folks_rs = $schema-&#62;resultset&#40;&#34;Folk&#34;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>Ho già parlato di <a href="http://www.simotrone.it/tag/dbix::class/">DBIx::Class</a>.</p>
<p>Avendo <a href="http://search.cpan.org/~abraxxa/DBIx-Class-0.08195/lib/DBIx/Class/ResultSource.pm">result source</a> con <a href="http://search.cpan.org/~abraxxa/DBIx-Class-0.08195/lib/DBIx/Class/Relationship.pm#has_many">relazioni</a> si possono ottenere <a href="http://search.cpan.org/~abraxxa/DBIx-Class-0.08195/lib/DBIx/Class/ResultSet.pm#create">risultati</a> interessanti.</p>
<p>Esistono gli oggetti Folk ed Email, ove l&#8217;oggetto Folk sia in relazione con molteplici oggetti Email (folk has_many emails).</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> My::<span class="me2">Schema</span>::<span class="me2">Result</span>::<span class="me2">Folk</span>;<br />
<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
__PACKAGE__-&gt;<span class="me1">has_many</span><span class="br0">&#40;</span><span class="st0">&#8216;emails&#8217;</span>,<span class="st0">&#8216;My::Schema::Result::Email&#8217;</span>,<span class="st0">&#8216;id&#8217;</span><span class="br0">&#41;</span>;</div>
</div>
<p>E&#8217; possibile creare un record scrivendo i dati dell&#8217;oggetto/i relativo/i in un arrayref.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">$folks_rs</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&quot;Folk&quot;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$new_folk</span> = <span class="re0">$folks_rs</span>-&gt;<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; name &nbsp; =&gt; <span class="st0">&#8216;Test folk&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; emails =&gt; <span class="br0">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; email &nbsp; =&gt; <span class="st0">&#8216;mail@casa.name&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comment =&gt; <span class="st0">&#8216;Test mail casalinga&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; email &nbsp; =&gt; <span class="st0">&#8216;mail@azienda.org&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comment =&gt; <span class="st0">&#8216;Test mail aziendale&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#93;</span>,<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</div>
<p>E ci si libera di tutto con un bel</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="re0">$new_folk</span>-&gt;<span class="me1">delete</span></div>
</div>
<p><span id="more-3607"></span><br />
Codice e output (con DBIC_TRACE attivo).</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict;<br />
<span class="kw2">use</span> warnings;<br />
<span class="kw2">use</span> My::<span class="me2">Schema</span>;<br />
<span class="kw2">use</span> DBIx::<span class="me2">Class</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$schema</span> &nbsp; = My::<span class="me2">Schema</span>-&gt;<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&quot;dbi:mysql:dbname=xxx&quot;</span>,<span class="st0">&quot;aaa&quot;</span>,<span class="st0">&quot;bbb&quot;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">$folks_rs</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&quot;Folk&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$new_folk</span> = <span class="re0">$folks_rs</span>-&gt;<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; name &nbsp; =&gt; <span class="st0">&#8216;Test folk&#8217;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; emails =&gt; <span class="br0">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span> email =&gt; <span class="st0">&#8216;mail@casa.name&#8217;</span>, comment =&gt; <span class="st0">&#8216;Test mail casalinga&#8217;</span> <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span> email =&gt; <span class="st0">&#8216;mail@azienda.org&#8217;</span>, comment =&gt; <span class="st0">&#8216;Test mail aziendale&#8217;</span> <span class="br0">&#125;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#93;</span>,<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>;<br />
show_folk<span class="br0">&#40;</span><span class="re0">$new_folk</span>-&gt;<span class="me1">id</span><span class="br0">&#41;</span>;<br />
<span class="re0">$new_folk</span>-&gt;<span class="me1">delete</span>;</p>
<p><span class="kw2">sub</span> show_folk <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$id</span><span class="br0">&#41;</span> = <span class="re0">@_</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$folk</span> = <span class="re0">$folks_rs</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="re0">$id</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">@emails</span> = <a href="http://perldoc.perl.org/functions/map.html"><span class="kw3">map</span></a> <span class="br0">&#123;</span> <span class="re0">$_</span>-&gt;<span class="me1">email</span> <span class="br0">&#125;</span> <span class="re0">$folk</span>-&gt;<span class="me1">emails</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; &quot;</span>.<span class="re0">$folk</span>-&gt;<span class="me1">name</span>, <span class="st0">&quot; [$id]<span class="es0">\n</span> &quot;</span>, <a href="http://perldoc.perl.org/functions/join.html"><span class="kw3">join</span></a><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span> &quot;</span>,<span class="re0">@emails</span><span class="br0">&#41;</span> , <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span></div>
</div>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="re2">DBIC_TRACE=</span><span class="nu0">1</span> <span class="kw2">perl</span> dbic_test.pl</p>
<p>BEGIN WORK<br />
INSERT INTO folks <span class="br0">&#40;</span> name<span class="br0">&#41;</span> VALUES <span class="br0">&#40;</span> ? <span class="br0">&#41;</span>: <span class="st0">&#8216;Test folk&#8217;</span><br />
INSERT INTO emails <span class="br0">&#40;</span> comment, email, <span class="kw2">id</span><span class="br0">&#41;</span> VALUES <span class="br0">&#40;</span> ?, ?, ? <span class="br0">&#41;</span>: <span class="st0">&#8216;Test mail casalinga&#8217;</span>, <span class="st0">&#8216;mail@casa.name&#8217;</span>, <span class="st0">&#8217;134&#8242;</span><br />
INSERT INTO emails <span class="br0">&#40;</span> comment, email, <span class="kw2">id</span><span class="br0">&#41;</span> VALUES <span class="br0">&#40;</span> ?, ?, ? <span class="br0">&#41;</span>: <span class="st0">&#8216;Test mail aziendale&#8217;</span>, <span class="st0">&#8216;mail@azienda.org&#8217;</span>, <span class="st0">&#8217;134&#8242;</span><br />
COMMIT</p>
<p>SELECT me.<span class="kw2">id</span>, me.name, me.surname, me.birth, me.gender, me.created, me.updated, me.active FROM folks me WHERE <span class="br0">&#40;</span> me.<span class="kw2">id</span> = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;134&#8242;</span><br />
SELECT me.<span class="kw2">id</span>, me.email, me.comment FROM emails me WHERE <span class="br0">&#40;</span> me.<span class="kw2">id</span> = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;134&#8242;</span><br />
&nbsp;Test folk <span class="br0">&#91;</span><span class="nu0">134</span><span class="br0">&#93;</span><br />
&nbsp;mail@azienda.org<br />
&nbsp;mail@casa.name<br />
BEGIN WORK<br />
DELETE FROM folks WHERE <span class="br0">&#40;</span> <span class="kw2">id</span> = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;134&#8242;</span><br />
SELECT me.<span class="kw2">id</span>, me.email, me.comment FROM emails me WHERE <span class="br0">&#40;</span> me.<span class="kw2">id</span> = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;134&#8242;</span><br />
DELETE FROM emails WHERE <span class="br0">&#40;</span> email = ? <span class="br0">&#41;</span>: <span class="st0">&#8216;mail@azienda.org&#8217;</span><br />
DELETE FROM emails WHERE <span class="br0">&#40;</span> email = ? <span class="br0">&#41;</span>: <span class="st0">&#8216;mail@casa.name&#8217;</span><br />
COMMIT</div>
</div>
<p>(Come si vede chiaramente con quel codice, le fasi di inserimento e selezione dei dati avvengono in due momenti distinti (ci sono due blocchi BEGIN/COMMIT infatti).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2011/11/02/dbic-create-e-relazioni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversione rapida</title>
		<link>http://www.simotrone.it/2010/02/16/conversione-rapida/</link>
		<comments>http://www.simotrone.it/2010/02/16/conversione-rapida/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 06:56:04 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[conversione]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[tabelle]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2675</guid>
		<description><![CDATA[Dovevo trasferire rapidamente i dati da una singola tabella in un db MySQL a quattro distinte &#8211; in modo da normalizzare un po&#8217; i dati. Con perl e DBI la cosa viene facile. #!/usr/bin/perl use strict; use DBI; &#91;&#8230;&#93; my $dsn = &#34;dbi:mysql:database=$db_name&#34;; my $dbh = DBI-&#62;connect&#40; $dsn, $username, $password &#41; or die $DBI::errstr; my [...]]]></description>
			<content:encoded><![CDATA[<p>Dovevo trasferire rapidamente i dati da una singola tabella in un db MySQL a quattro distinte &#8211; in modo da <a href="http://en.wikipedia.org/wiki/Database_normalization">normalizzare</a> un po&#8217; i dati.</p>
<p>Con perl e DBI la cosa viene facile.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict;<br />
<span class="kw2">use</span> DBI;<br />
<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
<span class="kw1">my</span> <span class="re0">$dsn</span> = <span class="st0">&quot;dbi:mysql:database=$db_name&quot;</span>;<br />
<span class="kw1">my</span> <span class="re0">$dbh</span> = DBI-&gt;<span class="me1">connect</span><span class="br0">&#40;</span> <span class="re0">$dsn</span>, <span class="re0">$username</span>, <span class="re0">$password</span> <span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$DBI</span>::<span class="me2">errstr</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$sth</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8216;SELECT name, surname, birth, address, cap, city, country, phone, email, notes FROM rubrica&#8217;</span><br />
<span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$dbh</span>-&gt;<span class="me1">errstr</span>;<br />
<span class="re0">$sth</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">my</span> <span class="re0">$ins0</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8216;INSERT INTO persone (nome,cognome) VALUES (?,?)&#8217;</span><br />
<span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$dbh</span>-&gt;<span class="me1">errstr</span>;<br />
<span class="kw1">my</span> <span class="re0">$ins1</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">&#8216;INSERT INTO indirizzi (id,via,cap,citta,paese) VALUES (?,?,?,?,?)&#8217;</span><br />
<span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="re0">$dbh</span>-&gt;<span class="me1">errstr</span>;<br />
<span class="br0">&#91;</span>&#8230; ecc, seguono altri statement insert &#8230;<span class="br0">&#93;</span></p>
<p><span class="kw1">while</span> <span class="br0">&#40;</span> <span class="kw1">my</span> <span class="re0">$row</span> = <span class="re0">$sth</span>-&gt;<span class="me1">fetchrow_hashref</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ins0</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span> <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>name<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>surname<span class="br0">&#125;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$rv</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">last_insert_id</span><span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a>, <a href="http://perldoc.perl.org/functions/undef.html"><span class="kw3">undef</span></a>, <span class="st0">&#8216;persone&#8217;</span>, <span class="st0">&#8216;id&#8217;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ins1</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span> <span class="re0">$rv</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>address<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>cap<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>city<span class="br0">&#125;</span>, <span class="re0">$row</span>-&gt;<span class="br0">&#123;</span>country<span class="br0">&#125;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
&nbsp;<span class="br0">&#125;</span></div>
</div>
<p>La cosa interessante sta in quel <a href="http://search.cpan.org/~timb/DBI-1.609/DBI.pm#last_insert_id">last_insert_id</a> che raccatta l&#8217;ultimo valore auto incrementato e lo mette in uno scalare, riutilizzabile poi in altri insert per avere le foreign key allineate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/02/16/conversione-rapida/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBIC, le join (2)</title>
		<link>http://www.simotrone.it/2010/02/13/dbic-le-join-2/</link>
		<comments>http://www.simotrone.it/2010/02/13/dbic-le-join-2/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 06:11:14 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBIx::Class]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[relazioni]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2697</guid>
		<description><![CDATA[Come già accennato, le relazioni fra gli schemi (che rappresentano tabelle) avvengono grazie alla configurazione di relazioni. Le due righe che seguono fanno esattamente la stessa cosa, e creano una relazione fra lo schema Folks e Addresses. # __PACKAGE__-&#62;has_many( &#34;addresses&#34;, &#160; &#34;Tr0n3::Schema::Agenda::Result::Addresses&#34;, &#160; &#160; { &#34;foreign.id&#34; =&#62; &#34;self.id&#34; } ); __PACKAGE__-&#62;has_many&#40; &#8216;addresses&#8217;, &#160; &#160; &#8216;Tr0n3::Schema::Agenda::Result::Addresses&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>Come <a href="http://www.simotrone.it/2010/02/05/dbixclass-le-join/">già accennato</a>, le relazioni fra gli schemi (che rappresentano tabelle) avvengono grazie alla configurazione di relazioni.</p>
<p>Le due righe che seguono fanno esattamente la stessa cosa, e creano una relazione fra lo schema Folks e Addresses.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1"># __PACKAGE__-&gt;has_many( &quot;addresses&quot;, &nbsp; &quot;Tr0n3::Schema::Agenda::Result::Addresses&quot;, &nbsp; &nbsp; { &quot;foreign.id&quot; =&gt; &quot;self.id&quot; } );</span><br />
__PACKAGE__-&gt;<span class="me1">has_many</span><span class="br0">&#40;</span> <span class="st0">&#8216;addresses&#8217;</span>, &nbsp; &nbsp; <span class="st0">&#8216;Tr0n3::Schema::Agenda::Result::Addresses&#8217;</span>, &nbsp; &nbsp; <span class="st0">&#8216;id&#8217;</span> <span class="br0">&#41;</span>;</div>
</div>
<p>Dunque se vorremo fare una join, potremo chiamare join sul metodo che determina la relazione (<em>addresses</em>, guarda caso l&#8217;ho chiamato come la tabella da joinare, ma si noti bene che quello è il nome della relazione segnato come primo parametro in <strong>has_many</strong>) proprio come segue:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">$join</span> = <span class="re0">$rs</span><span class="br0">&#123;</span><span class="st0">&#8216;folks&#8217;</span><span class="br0">&#125;</span>-&gt;<span class="me1">search</span><span class="br0">&#40;</span> <span class="br0">&#123;</span> <span class="st0">&#8216;me.id&#8217;</span> =&gt; <span class="nu0">27</span> <span class="br0">&#125;</span>, <span class="br0">&#123;</span> <a href="http://perldoc.perl.org/functions/join.html"><span class="kw3">join</span></a> =&gt; <span class="st0">&#8216;addresses&#8217;</span> <span class="br0">&#125;</span> <span class="br0">&#41;</span>-&gt;<span class="me1">single</span>;</div>
</div>
<p>che lancerà la seguente query:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">SELECT</span> me.id, me.name, me.surname, me.created, me.updated <span class="kw1">FROM</span> folks me <span class="kw1">LEFT</span> <span class="kw1">JOIN</span> addresses addresses <span class="kw1">ON</span> addresses.id = me.id <span class="kw1">WHERE</span> <span class="br0">&#40;</span> me.id = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;27&#8242;</span></div>
</div>
<p>Come si vede dall&#8217;SQL risultante, i dati della tabella <em>joinata</em> <strong>NON</strong> sono <em>fetchati</em> dal database (e nemmeno i metodi corrispettivi), comunque è possibile filtrare i dati su entrambe le tabelle sfruttando nella clausola WHERE anche i campi della seconda tabella.<br />
Ad esempio:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">@join</span> = <span class="re0">$rs</span><span class="br0">&#123;</span><span class="st0">&#8216;folks&#8217;</span><span class="br0">&#125;</span>-&gt;<span class="me1">search</span><span class="br0">&#40;</span> <span class="br0">&#123;</span> name =&gt; <span class="st0">&#8216;Simone&#8217;</span> , <span class="st0">&#8216;addresses.city&#8217;</span> =&gt; <span class="br0">&#123;</span> LIKE =&gt; <span class="st0">&#8216;%a&#8217;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>, <span class="br0">&#123;</span> <a href="http://perldoc.perl.org/functions/join.html"><span class="kw3">join</span></a> =&gt; <span class="st0">&#8216;addresses&#8217;</span> <span class="br0">&#125;</span> <span class="br0">&#41;</span>;</div>
</div>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">SELECT</span> me.id, me.name, me.surname, me.created, me.updated <span class="kw1">FROM</span> folks me <span class="kw1">LEFT</span> <span class="kw1">JOIN</span> addresses addresses <span class="kw1">ON</span> addresses.id = me.id <span class="kw1">WHERE</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> addresses.city <span class="kw1">LIKE</span> ? <span class="kw1">AND</span> name = ? <span class="br0">&#41;</span> <span class="br0">&#41;</span>: <span class="st0">&#8216;%a&#8217;</span>, <span class="st0">&#8216;Simone&#8217;</span></div>
</div>
<p>Cerca i dati in Folks dove il nome del folk è &#8216;Simone&#8217; e dove la città (in addresses) finisce per &#8216;a&#8217;.</p>
<p>Con <em>prefetch</em> al posto di <em>join</em> vengono <em>fetchate</em> tutte le colonne:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">@join</span> = <span class="re0">$rs</span><span class="br0">&#123;</span><span class="st0">&#8216;folks&#8217;</span><span class="br0">&#125;</span>-&gt;<span class="me1">search</span><span class="br0">&#40;</span> <span class="br0">&#123;</span> name =&gt; <span class="st0">&#8216;Simone&#8217;</span> , <span class="st0">&#8216;addresses.city&#8217;</span> =&gt; <span class="br0">&#123;</span> LIKE =&gt; <span class="st0">&#8216;%a&#8217;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>, <span class="br0">&#123;</span> prefetch =&gt; <span class="st0">&#8216;addresses&#8217;</span> <span class="br0">&#125;</span> <span class="br0">&#41;</span>;</div>
</div>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">SELECT</span> me.id, me.name, me.surname, me.created, me.updated, addresses.id, addresses.address, addresses.zip, addresses.city, addresses.country <span class="kw1">FROM</span> folks me <span class="kw1">LEFT</span> <span class="kw1">JOIN</span> addresses addresses <span class="kw1">ON</span> addresses.id = me.id <span class="kw1">WHERE</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span> addresses.city <span class="kw1">LIKE</span> ? <span class="kw1">AND</span> name = ? <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="kw1">ORDER</span> <span class="kw1">BY</span> addresses.id: <span class="st0">&#8216;%a&#8217;</span>, <span class="st0">&#8216;Simone&#8217;</span></div>
</div>
<p>Come spiegato <a href="http://search.cpan.org/~ribasushi/DBIx-Class-0.08118/lib/DBIx/Class/ResultSet.pm#as">qua</a>, per accedere ai dati si può usare un metodo <strong>già definito</strong> oppure <strong>get_column()</strong>.<br />
La selezione delle colonne avviene attraverso i metodi <strong>select</strong> e <strong>as</strong></p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://perldoc.perl.org/functions/select.html"><span class="kw3">select</span></a> =&gt; <span class="br0">&#91;</span> <span class="st0">&#8216;table1.col1&#8242;</span>, <span class="st0">&#8216;table1.col2&#8242;</span>, &#8230; <span class="br0">&#93;</span>,<br />
as =&gt; <span class="br0">&#91;</span> <span class="st0">&#8216;nome_col1&#8242;</span>, <span class="st0">&#8216;nome_col2&#8242;</span> <span class="br0">&#93;</span></div>
</div>
<p>oppure con <strong>columns</strong></p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">columns =&gt; <span class="br0">&#91;</span> <span class="st0">&#8216;table1.col1&#8242;</span>, &#8230; <span class="br0">&#93;</span></div>
</div>
<p>che mi è parso una combinazione dei due.</p>
<p>Si può mettere un &#8216;+&#8217; davanti al nome per aggiungere le colonne selezionate al resultset.<br />
Ad esempio, dopo una join in cui vengono richiamati solo i campi della tabella principale, potremmo rendere disponibili le colonne di un altra tabella con &#8216;+columns&#8217;:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="br0">&#123;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/join.html"><span class="kw3">join</span></a> =&gt; <span class="br0">&#91;</span> <span class="st0">&#8216;tabella2&#8242;</span>, <span class="st0">&#8216;tabella3&#8242;</span> <span class="br0">&#93;</span>,<br />
&nbsp; <span class="st0">&#8216;+columns&#8217;</span> =&gt; <span class="br0">&#91;</span> <span class="st0">&#8216;tabella2.col1&#8242;</span>, <span class="st0">&#8216;tabella3.col2&#8242;</span> <span class="br0">&#93;</span>,<br />
&nbsp; &#8230;<br />
<span class="br0">&#125;</span></div>
</div>
<hr/>
<p>Inoltre grazie alle relazioni potremo anche raccattare dati da uno schema diverso dal resultset di partenza, come in questo caso:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">$folks_addresses</span> = <span class="re0">$rs</span><span class="br0">&#123;</span><span class="st0">&#8216;folks&#8217;</span><span class="br0">&#125;</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="nu0">27</span><span class="br0">&#41;</span>-&gt;<span class="me1">addresses</span>-&gt;<span class="me1">single</span>;</div>
</div>
<p>che sarà rappresentato da queste due query consecutive:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">SELECT</span> me.id, me.name, me.surname, me.created, me.updated <span class="kw1">FROM</span> folks me <span class="kw1">WHERE</span> <span class="br0">&#40;</span> me.id = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;27&#8242;</span><br />
<span class="kw1">SELECT</span> me.id, me.address, me.zip, me.city, me.country <span class="kw1">FROM</span> addresses me <span class="kw1">WHERE</span> <span class="br0">&#40;</span> me.id = ? <span class="br0">&#41;</span>: <span class="st0">&#8217;27&#8242;</span></div>
</div>
<p>Questi sono gli oggetti Addresses (cioè gli indirizzi) appartenenti al Folk num. 27:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">$folk</span> = <span class="re0">$folks_rs</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="nu0">27</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">@addresses</span> = <span class="re0">$folk</span>-&gt;<span class="me1">addresses</span>;</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/02/13/dbic-le-join-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysqlshow</title>
		<link>http://www.simotrone.it/2010/02/10/mysqlshow/</link>
		<comments>http://www.simotrone.it/2010/02/10/mysqlshow/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 20:29:44 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[mysqlshow]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2664</guid>
		<description><![CDATA[Lo sapevo che prima o poi mi avrebbe punito. Ho imparato l&#8217;SQL e i db stando su MySQL, poi sono passato a Pg per varie ragioni (di lavoro ed altro). Mi sono trovato assolutamente bene con Postgre &#8211; pur lottando ogni tanto con la sua macchinosità, e alla fine mi sono ritrovato a non usare [...]]]></description>
			<content:encoded><![CDATA[<p>Lo sapevo che prima o poi mi avrebbe punito.<br />
Ho imparato l&#8217;SQL e i db stando su MySQL, poi sono passato a Pg per varie ragioni (di lavoro ed altro).<br />
Mi sono trovato assolutamente bene con Postgre &#8211; pur lottando ogni tanto con la sua macchinosità, e alla fine mi sono ritrovato a non usare mai MySQL&#8230; fino ad oggi. E ovviamente non mi ricordo (quasi) più nulla.</p>
<p>Poco male, si ricomincia. E due DB <em>is meil che one</em> (almeno finchè ci sono gli ORM come DBIC che capiscon tutto loro).</p>
<p>Mentre pistolavo a casaccio, ho visto che MySQL ha un tot di script da shell che mostrano un po&#8217; di robba, e comunque aiutano se li si impara ad usare.</p>
<pre>$ mysqlshow
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| agenda             |
| cmsfdt             |
| evento_odg         |
| libri              |
| mail               |
| mysql              |
| studiog7           |
| system_backup      |
| test               |
| test_blog          |
| wines              |
| wp281              |
+--------------------+

$ mysqlshow libri
Database: libri
+---------+
| Tables  |
+---------+
| book    |
| details |
+---------+

$ mysqlshow libri book
Database: libri  Table: book
+---------+-----------+-------------------+------+--
| Field   | Type      | Collation         | Null | ..
+---------+-----------+-------------------+------+--
| id      | int(11)   |                   | NO   | ..
| titolo  | char(100) | latin1_swedish_ci | NO   | ..
| autore  | char(100) | latin1_swedish_ci | NO   | ..
| editore | char(50)  | latin1_swedish_ci | NO   | ..
+---------+-----------+-------------------+------+---
</pre>
<p>A me è parso caruccio.<br />
 <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Edit postumo: mysqlshow ha un po&#8217; di opzioni. Una cosa che ho trovato utile è stato usare l&#8217;opzione &#8211;count che dice quante righe ha la tabella richiesta (ho aggiunto in ~/.bashrc alias mysqlshow=&#8217;mysqlshow &#8211;count&#8217;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/02/10/mysqlshow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DBIx::Class &#8211; Le join</title>
		<link>http://www.simotrone.it/2010/02/05/dbixclass-le-join/</link>
		<comments>http://www.simotrone.it/2010/02/05/dbixclass-le-join/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 06:49:47 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[DBIx::Class]]></category>
		<category><![CDATA[join]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2649</guid>
		<description><![CDATA[Dopo aver bestemmiato come un satanista, forse ne sono uscito. Finalmente. Gli schemi che si mangia DBIx::Class sono di questo genere (ho tagliato la definizione delle colonne, perché irrilevante): package Tr0n3::Schema::Main::Result::Thoughts; &#91;&#8230;&#93; use base &#8216;DBIx::Class&#8217;; __PACKAGE__-&#62;load_components&#40;&#34;InflateColumn::DateTime&#34;, &#34;TimeStamp&#34;, &#34;EncodedColumn&#34;, &#34;Core&#34;&#41;; __PACKAGE__-&#62;table&#40;&#34;thoughts&#34;&#41;; __PACKAGE__-&#62;add_columns&#40; &#160; &#34;id&#34;, &#160;&#123; &#91;&#8230;&#93; &#125;, &#160; &#34;title&#34;, &#160;&#123; &#91;&#8230;&#93; &#125;, &#160; &#34;body&#34;, &#160;&#123; &#91;&#8230;&#93; [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo aver bestemmiato come un satanista, forse ne sono uscito. Finalmente.</p>
<p>Gli schemi che si mangia DBIx::Class sono di questo genere (ho tagliato la definizione delle colonne, perché irrilevante):</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> Tr0n3::<span class="me2">Schema</span>::<span class="me2">Main</span>::<span class="me2">Result</span>::<span class="me2">Thoughts</span>;<br />
<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
<span class="kw2">use</span> base <span class="st0">&#8216;DBIx::Class&#8217;</span>;</p>
<p>__PACKAGE__-&gt;<span class="me1">load_components</span><span class="br0">&#40;</span><span class="st0">&quot;InflateColumn::DateTime&quot;</span>, <span class="st0">&quot;TimeStamp&quot;</span>, <span class="st0">&quot;EncodedColumn&quot;</span>, <span class="st0">&quot;Core&quot;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">table</span><span class="br0">&#40;</span><span class="st0">&quot;thoughts&quot;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">add_columns</span><span class="br0">&#40;</span><br />
&nbsp; <span class="st0">&quot;id&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;title&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;body&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;create_time&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;last_modif&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;author_id&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
<span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">set_primary_key</span><span class="br0">&#40;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">add_unique_constraint</span><span class="br0">&#40;</span><span class="st0">&quot;thought_pkey&quot;</span>, <span class="br0">&#91;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">belongs_to</span><span class="br0">&#40;</span><br />
&nbsp; <span class="st0">&quot;author_id&quot;</span>, &nbsp; <span class="st0">&quot;Tr0n3::Schema::Main::Result::Authors&quot;</span>, &nbsp; <span class="br0">&#123;</span> id =&gt; <span class="st0">&quot;author_id&quot;</span> <span class="br0">&#125;</span>,<br />
<span class="br0">&#41;</span>;<br />
<span class="nu0">1</span>;</div>
</div>
<p>e</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><a href="http://perldoc.perl.org/functions/package.html"><span class="kw3">package</span></a> Tr0n3::<span class="me2">Schema</span>::<span class="me2">Main</span>::<span class="me2">Result</span>::<span class="me2">Authors</span>;<br />
<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
<span class="kw2">use</span> base <span class="st0">&#8216;DBIx::Class&#8217;</span>;</p>
<p>__PACKAGE__-&gt;<span class="me1">load_components</span><span class="br0">&#40;</span><span class="st0">&quot;InflateColumn::DateTime&quot;</span>, <span class="st0">&quot;TimeStamp&quot;</span>, <span class="st0">&quot;EncodedColumn&quot;</span>, <span class="st0">&quot;Core&quot;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">table</span><span class="br0">&#40;</span><span class="st0">&quot;authors&quot;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">add_columns</span><span class="br0">&#40;</span><br />
&nbsp; <span class="st0">&quot;id&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;nick&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;password&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;mail&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;create_time&quot;</span>, &nbsp; <span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
&nbsp; <span class="st0">&quot;last_login&quot;</span>, &nbsp;<span class="br0">&#123;</span> <span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span> <span class="br0">&#125;</span>,<br />
<span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">set_primary_key</span><span class="br0">&#40;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">add_unique_constraint</span><span class="br0">&#40;</span><span class="st0">&quot;authors_pkey&quot;</span>, <span class="br0">&#91;</span><span class="st0">&quot;id&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">has_many</span><span class="br0">&#40;</span><br />
&nbsp; <span class="st0">&quot;links&quot;</span>, &nbsp; <span class="st0">&quot;Tr0n3::Schema::Main::Result::Links&quot;</span>, &nbsp; <span class="br0">&#123;</span> <span class="st0">&quot;foreign.author_id&quot;</span> =&gt; <span class="st0">&quot;self.id&quot;</span> <span class="br0">&#125;</span>,<br />
<span class="br0">&#41;</span>;<br />
__PACKAGE__-&gt;<span class="me1">has_many</span><span class="br0">&#40;</span> &nbsp; <span class="st0">&quot;thoughts&quot;</span>, &nbsp; <span class="st0">&quot;Tr0n3::Schema::Main::Result::Thoughts&quot;</span>, &nbsp; <span class="br0">&#123;</span> <span class="st0">&quot;foreign.author_id&quot;</span> =&gt; <span class="st0">&quot;self.id&quot;</span> <span class="br0">&#125;</span>,<br />
<span class="br0">&#41;</span>;<br />
<span class="nu0">1</span>;</div>
</div>
<p>Per fare una join con DBIC ci si appoggia alle <a href="http://search.cpan.org/~frew/DBIx-Class-0.08115/lib/DBIx/Class/Relationship.pm">relazioni</a>:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">Authors-&gt;<span class="me1">has_many</span><span class="br0">&#40;</span> <span class="st0">&quot;thoughts&quot;</span>, <span class="st0">&quot;Tr0n3::Schema::Main::Result::Thoughts&quot;</span>, <span class="br0">&#123;</span> <span class="st0">&quot;foreign.author_id&quot;</span> =&gt; <span class="st0">&quot;self.id&quot;</span> <span class="br0">&#125;</span>, <span class="br0">&#41;</span>;</p>
<p>Thoughts-&gt;<span class="me1">belongs_to</span><span class="br0">&#40;</span> <span class="st0">&quot;author_id&quot;</span>, <span class="st0">&quot;Tr0n3::Schema::Main::Result::Authors&quot;</span>, &nbsp; <span class="br0">&#123;</span> id =&gt; <span class="st0">&quot;author_id&quot;</span> <span class="br0">&#125;</span>, <span class="br0">&#41;</span>;</div>
</div>
<p><strong>has_many</strong> crea una relazione &#8220;uno a molti&#8221;, e ha come argomenti: il nome dell&#8217;accessor, il nome della classe che rappresenta la tabella, un <em>hashref</em> con la <em>reference</em> (a cosa punta la <em>foreign key</em>).<br />
In pratica lo schema Authors è in connessione uno a molti con Thoughs (per un Author ci possono essere molti Thoughts) , la relazione si chiama thoughts e vi si accede attraverso l&#8217;accessor thoughts, che punta allo schema Main::Result::Thoughts, secondo la relazione author_id (nella tabella thoughts) &#8211; id (nella tabella author).</p>
<p>In maniera analoga, lo schema Thoughts ha una relazione <strong>belongs_to</strong> con nome author_id, che punta allo schema Authors e che lega l&#8217;id in Authors con l&#8217;author_id di Thoughts.</p>
<p>Grazie a queste relazioni esplicitate nello schema, è possibile creare delle <a href="http://search.cpan.org/~frew/DBIx-Class-0.08115/lib/DBIx/Class/Manual/Cookbook.pod#JOINS_AND_PREFETCHING">join in DBIx::Class</a>:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">$thoughts_rs</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;Thoughts&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="kw1">my</span> <span class="re0">@join_TA</span> = <span class="re0">$thoughts_rs</span>-&gt;<span class="me1">search</span><span class="br0">&#40;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>, <span class="br0">&#123;</span> <a href="http://perldoc.perl.org/functions/join.html"><span class="kw3">join</span></a> =&gt; <span class="st0">&#8216;author_id&#8217;</span>, columns =&gt; <span class="br0">&#91;</span> <a href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span></a>/ id title create_time author_id.nick / <span class="br0">&#93;</span>, <span class="br0">&#125;</span> <span class="br0">&#41;</span>;</div>
</div>
<p>Questa join parte dal ResultSet di Thoughts e senza filtri fa un JOIN con author attraverso l&#8217;accessor author_id.<br />
L&#8217;SQL risultante è:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">SELECT</span> me.id, me.title, me.create_time, author_id.nick <span class="kw1">FROM</span> thoughts me <span class="kw1">JOIN</span> authors author_id <span class="kw1">ON</span> author_id.id = me.author_id</div>
</div>
<p>(Il prefisso &#8220;me&#8221; &#8211; inserito da DBIC &#8211; indica la tabella a sinistra del join.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/02/05/dbixclass-le-join/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DBIx::Class e Schema::Loader</title>
		<link>http://www.simotrone.it/2010/01/11/dbixclass-e-schemaloader/</link>
		<comments>http://www.simotrone.it/2010/01/11/dbixclass-e-schemaloader/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 06:29:00 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBIx::Class]]></category>
		<category><![CDATA[DBIx::Class::Schema::Loader]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2614</guid>
		<description><![CDATA[A forza di spaccarsi la testa sulle cose, ogni tanto se ne esce. Avendo un database su PostgreSQL, e volendo manipolarlo con strumenti ORM in perl si può usare DBIx::Class (DBIC per gli amici). DBIC si appoggia a &#8220;schemi&#8221; di tabelle nel database che gli permettono di interagire col db-server in maniera corretta (e ottimizzata). [...]]]></description>
			<content:encoded><![CDATA[<p>A forza di spaccarsi la testa sulle cose, ogni tanto se ne esce.<br />
Avendo un database su PostgreSQL, e volendo manipolarlo con strumenti <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> in perl si può usare <a href="http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod">DBIx::Class</a> (DBIC per gli amici).</p>
<p>DBIC si appoggia a &#8220;schemi&#8221; di tabelle nel database che gli permettono di interagire col db-server in maniera corretta (e ottimizzata).<br />
Gli schemi sono un po&#8217; pallosi da estrarre, ma a tutto c&#8217;è soluzione:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">perl</span> -MDBIx::Class::Schema::<span class="re2">Loader=</span>make_schema_at,dump_to_dir:. -e <span class="st0">&#8216;make_schema_at(&quot;Sim::Prova&quot;, {debug=&gt;1}, [ &quot;dbi:Pg:dbname=XXX&quot;,&quot;YYY_user&quot;,&quot;ZZZ_passwd&quot; ])&#8217;</span></div>
</div>
<p>Dopo questo comando nella directory Sim ci sarà un pacchetto Prova.pm (lo schema) che caricherà le classi che rappresentano le tabelle del database XXX (nella dir Sim/Prova/tabella_*.pm).</p>
<p>Le rappresentazioni delle tabelle sono interessanti da guardare. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Da questo momento sarà possibile scrivere script che usino lo schema (<strong>Sim::Prova</strong>), si connettano attraverso di esso (metodo <strong>connect</strong>) ed agiscano sui dati del database XXX.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1">#!/usr/bin/perl</span><br />
<span class="kw2">use</span> Sim::<span class="me2">Prova</span>;<br />
<span class="kw1">my</span> <span class="re0">$schema</span> = Sim::<span class="me2">Prova</span>-&gt;<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&#8216;dbi:Pg:dbname=XXX&#8217;</span>, <span class="st0">&#8216;YYY_user&#8217;</span>, <span class="st0">&#8216;ZZZ_passwd&#8217;</span>, <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">my</span> <span class="re0">@all_authors</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;Authors&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">all</span>;<br />
<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">@all_authors</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$_</span>-&gt;<span class="me1">name</span> .<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span></div>
</div>
<p>L&#8217;oggetto <strong>$schema</strong> porta la connessione, tramite <strong>->resultset(&#8216;table&#8217;)</strong> capisce com&#8217;è organizzata la tabella nel db e poi accetta i metodi utili per fare qualcosa (CRUD: Create, Retrieve, Update, Delete).</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co1"># C</span><br />
<span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;tabella&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">create</span><span class="br0">&#40;</span> <span class="br0">&#123;</span>id =&gt; <span class="nu0">1</span>, name =&gt; <span class="st0">&#8216;Simone&#8217;</span><span class="br0">&#125;</span> <span class="br0">&#41;</span>;</p>
<p><span class="co1"># R</span><br />
<span class="kw1">my</span> <span class="re0">@rows</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;tabella&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">all</span>;<br />
<span class="kw1">foreach</span> <span class="re0">$row</span> <span class="br0">&#40;</span><span class="re0">@rows</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="re0">$_</span>-&gt;<span class="me1">id</span> .<span class="st0">&quot; | &quot;</span>. <span class="re0">$_</span>-&gt;<span class="me1">name</span> .<span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;<br />
<span class="br0">&#125;</span> </p>
<p><span class="co1"># U</span><br />
<span class="kw1">my</span> <span class="re0">$author</span> = <span class="re0">$schema</span>-&gt;<span class="me1">resultset</span><span class="br0">&#40;</span><span class="st0">&#8216;tabella&#8217;</span><span class="br0">&#41;</span>-&gt;<span class="me1">find</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;<br />
<span class="co1"># dentro $author c&#8217;è il nostro record.</span><br />
<span class="re0">$author</span>-&gt;<span class="me1">name</span><span class="br0">&#40;</span><span class="st0">&#8216;Mario Rossi&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="co1"># rimpiazza l&#8217;attributo &quot;name&quot; di $author con qualcosa di diverso.</span><br />
<span class="co1"># A questo punto il database ha ancora il record non cambiato, ma</span><br />
<span class="co1"># $author contiene un record differente.</span><br />
<span class="re0">$author</span>-&gt;<span class="me1">update</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="co1"># così aggiorno i dati sul db.</span></p>
<p><span class="co1"># D</span><br />
<span class="co1"># Come update, si identifica il record giusto e&#8230;</span><br />
<span class="re0">$author</span>-&gt;<span class="me1">delete</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</div>
<p>Un po&#8217; di <a href="http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Intro.pod#Basic_usage"><em>basic usage</em></a> e di <a href="http://search.cpan.org/~frew/DBIx-Class-0.08115/lib/DBIx/Class/Manual/DocMap.pod">manualistica</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/01/11/dbixclass-e-schemaloader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 [...]]]></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 [...]]]></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 [...]]]></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>

