File Coverage

blib/lib/Tutorial/DBIx/Class/Perl/ORM/Conexao/Com/Banco/de/Dados/PT/BR.pm
Criterion Covered Total %
statement 6 6 100.0
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 8 8 100.0


line stmt bran cond sub pod time code
1             package Tutorial::DBIx::Class::Perl::ORM::PT::BR;
2 1     1   40346 use strict;
  1         2  
  1         37  
3 1     1   5 use warnings;
  1         1  
  1         187  
4              
5             our $VERSION = '0.01';
6              
7             =pod
8              
9             =encoding utf8
10              
11             =head1 Tutorial DBIx::Class, conexao com banco de dados com perl ORM PT BR
12              
13             =head2 Resumo
14              
15             Neste artigo, dou várias dicas de como fazer determinadas coisas com dbix class. Este não vai ser fácil para iniciantes que não leram a documentação.
16             No entanto, espero que sirva como referência.
17              
18             =head2 Código Fonte
19              
20             Faça o download do pacote e acesse o diretório 'app' para obter o código fonte do exemplo utilizado.
21              
22             =head2 O que é o DBIx::Class ?
23              
24             DBIx::Class é um extensível e flexível objeto <-> mapeamento relacional
25             Na minha opinião é o mais fantástico mapeamento objeto relacional.
26              
27             Com ele você consegue acessar tabelas relacionadas a partir de qualquer ponto. Ou seja, vamos supor que temos um db assim:
28              
29             ______ _______ _______ ________
30             | | | | | | | |
31             | pai |----------<| filho |-----------<| amigo |--------------|namorada|
32             |______| 1 ou + |_______| 1 ou + |_______| apenas 1 |________|
33              
34             (pai tem 1 ou + filhos, cada filho pode ter 1 ou + amigos e cada amigo
35             pode ter 1 namorada )
36              
37             Agora vamos supor que estamos usando dbix class e queremos adicionar:
38             - 1 pai,
39             - 1 filho,
40             - 2 amigos
41             - 2 namordas para cada amigo inserido
42              
43             É bastante simples... veja como na seção de apêndice logo após as dicas de A a Z.
44              
45              
46             =head2 A. Como gerar os models se você já tem o banco de dados, com catalyst:
47              
48             $ script/myapp_create.pl model DB DBIC::Schema MyApp::DB create=static dbi:Pg:dbname=myapp USER pass
49             $ script/myapp_create.pl model DB DBIC::Schema MyApp::DB create=static dbi:mysql:db=myapp USER pass
50              
51             =head2 B. Como gerar os models se você já tem o banco de dados, sem catalyst:
52              
53             dbicdump -o dump_directory=./lib \
54             -o components='["InflateColumn::DateTime"]' \ <-- *** nao obrigatorio
55             -o debug=1 \
56             My::Schema \
57             'dbi:Pg:dbname=foo' \
58             myuser \
59             mypassword
60              
61             =head2 C. Ex de script simplão (p/ executar via console) com dbix class (sem catalsyt):
62              
63             1. fazer um schema dump com dbix class schema loader (letra B)
64             2. colocar seu projeto em pastas assim:
65             /myapp
66             /myapp/programa.pl
67             /myapp/lib
68             /myapp/lib/DBSchema
69              
70             3.editar seu programa.pl e adicionar estas linhas para ele poder utilizar o DBSchema:
71             use lib ( "./lib" );
72             use DBSchema;
73             my $schema = DBSchema->connect('dbi:Pg:dbname=saude', 'hernan', '123');
74             my $medico = $schema->resultset('Medico')->find({ id => 1});
75             print $medico->name;
76              
77             =head2 D. Exemplo de cache direto no dbix class:
78              
79             http://search.cpan.org/~rkitover/Catalyst-Model-DBIC-Schema-0.41/lib/Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm
80              
81             __PACKAGE__->config({
82             traits => ['Caching'],
83             connect_info =>
84             ['dbi:mysql:db', 'user', 'pass'],
85             });
86              
87             $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
88              
89              
90             =head2 E. Exemplo de ResultSet (extendendo os models), nos permite jogar todas as lógicas nos models, gerando thin controllers fat models.
91              
92             Depois é só acessar como se fosse um metodo.
93             infos: http://beta.metacpan.org/module/Catalyst::Model::DBIxResultSet
94              
95             sub is_my_img {
96             my ($self, $c, $img_gallery_id) = @_;
97             return $self->search({
98             id => $img_gallery_id,
99             user_id => $c->user->id,
100             });
101              
102             No controller:
103             my $test = $c->model('DBICSchemamodel::ImgGallery')->is_my_img($c, $pks[0])->single();
104              
105              
106             =head2 F. Deploy de banco de dados, Tendo os models em mãos, é possível criar as tabelas (após conectar) num banco de dados:
107              
108             $schema->deploy
109              
110             =head2 G. Exemplo de coluna Count
111              
112             dbic dbix class count
113             search({}, {
114             order_by => { -desc => \'count(tracks.trackid)' },
115             join => 'tracks',
116             distinct => 1,
117             });
118              
119             =head2 H. Custom Query
120              
121             my $schema = DB->connect(...);
122             my $stmt = 'create table foo ( id int );';
123             $schema->storage->dbh->prepare( $stmt )->execute()
124              
125             =head2 I. Exemplo HashReinflator (hashreinflator devolve um hash ao inves de um resultset), com cache:
126              
127             my $uniqueKey = md5_hex($schemamodel);
128             my $cached_data;
129             unless ( $cached_data = $c->cache->get($uniqueKey) ) {
130             my $result = $c->model($schemamodel)
131             ->search({
132             is_deleted => 0,
133             },{
134             });
135             $result->result_class('DBIx::Class::ResultClass::HashRefInflator'); #sets the result to be hashreinflator
136             my @items_list = $result->all; #inflates the whole resultset into a array hash
137             use Data::Dumper;
138             $c->log->debug('Dumper ' . Dumper( \@items_list ));
139             $cached_data = \@items_list;
140             $c->cache->set( $uniqueKey, $cached_data );
141             }
142              
143             =head2 J. Insert multiplo:
144              
145             $cd->artistname(shift @{$c->req->params->{artistname}});
146             $cd->update();
147              
148             =head2 K. Adicionando um metodo (no model/resultset) que retorna preço formatado
149              
150             sub preco_fmt #retorna preço formatado
151             {
152             my $self = shift @_;
153             return 'R$ ' . sub { my $price_fmt = $self->preco() ; $price_fmt =~ s/\./,/g; return $price_fmt; }->();
154             }
155              
156             =head2 L. DBIx::Class search NOT IN, -not_in, not in
157              
158             ->search({...
159             id => {
160             'not in' => [1,2],
161             },
162             ...},{});
163              
164             =head2 M. Order by count
165              
166             order_by => \''COUNT(\'story_id\') AS count'
167             order_by => \'COUNT(\'story_id\') DESC'
168              
169             =head2 N. update user session data
170              
171             $c->user->obj->discard_changes
172              
173             =head2 O. Exemplo de um ResultSet Class para o model Company
174              
175             package myapp::DBSchema::ResultSet::Company;
176             use strict;
177             use warnings;
178             use base 'DBIx::Class::ResultSet';
179              
180             sub all_companys {
181             my ($self) = @_;
182             my @companys = $self->
183             search( { 'me.is_deleted' => 0 }, { order_by => ['me.name ASC',] } )->all;
184             return @companys;
185             }
186              
187             1;
188              
189             =head2 P. **** ATive o trace do dbix class para debugar as querys, etc...
190              
191             sem cores:
192             $ export DBIC_TRACE=1 && script/imobiliaria_software_server.pl -r -d -p 3089
193             com cores:
194             $ export DBIC_TRACE_PROFILE=console && export DBIC_TRACE=1 && script/imobiliaria_software_server.pl -r -d -p 3089
195              
196             =head2 Q. Query no dbix class:
197              
198             $item = $schema->resultset('Medico')->find(); #retorna uma row, pode ser acessado ex.
199             $item->id,
200             $item->nome,
201             $item->nome('novo nome')
202             $item->update
203             @res = $schema->resultset('Medico')->search({},{})->all #Retorna array
204             $res = $schema->resultset('Medico')->search({...},{}) #Retorna varias rows e para fazer loop tem que fazer: while ( my $item = $res->next ) { ... }
205              
206             =head2 APÊNDICE
207              
208             Veja como é bacana e elegante trabalhar com DBIx::Class
209              
210             =head2 Crie seu banco de dados ( utilizei postgresql )
211              
212             Eu recomento a utilização do postgres para ensinar dbix class pois o postgres salva os relacionamentos dentro do banco de dados e isso facilita pois o dbix class consegue detectar esses relacionamentos e já cria todos os models para nós incluindo esses relacionamentos.
213              
214             CREATE TABLE amigo (
215             id integer NOT NULL,
216             nome text,
217             amigo_id integer
218             );
219             ALTER TABLE public.amigo OWNER TO hernan;
220             CREATE SEQUENCE amigo_id_seq
221             START WITH 1
222             INCREMENT BY 1
223             NO MINVALUE
224             NO MAXVALUE
225             CACHE 1;
226             ALTER TABLE public.amigo_id_seq OWNER TO hernan;
227             ALTER SEQUENCE amigo_id_seq OWNED BY amigo.id;
228             SELECT pg_catalog.setval('amigo_id_seq', 1, false);
229             CREATE TABLE filho (
230             id integer NOT NULL,
231             nome text,
232             pai_id integer
233             );
234             ALTER TABLE public.filho OWNER TO hernan;
235             CREATE SEQUENCE filho_id_seq
236             START WITH 1
237             INCREMENT BY 1
238             NO MINVALUE
239             NO MAXVALUE
240             CACHE 1;
241             ALTER TABLE public.filho_id_seq OWNER TO hernan;
242             ALTER SEQUENCE filho_id_seq OWNED BY filho.id;
243             SELECT pg_catalog.setval('filho_id_seq', 1, false);
244             CREATE TABLE namorada (
245             id integer NOT NULL,
246             nome text,
247             amigo_id integer
248             );
249             ALTER TABLE public.namorada OWNER TO hernan;
250             CREATE SEQUENCE namorada_id_seq
251             START WITH 1
252             INCREMENT BY 1
253             NO MINVALUE
254             NO MAXVALUE
255             CACHE 1;
256             ALTER TABLE public.namorada_id_seq OWNER TO hernan;
257             ALTER SEQUENCE namorada_id_seq OWNED BY namorada.id;
258             SELECT pg_catalog.setval('namorada_id_seq', 1, false);
259             CREATE TABLE pai (
260             id integer NOT NULL,
261             nome text
262             );
263             ALTER TABLE public.pai OWNER TO hernan;
264             CREATE SEQUENCE pai_id_seq
265             START WITH 1
266             INCREMENT BY 1
267             NO MINVALUE
268             NO MAXVALUE
269             CACHE 1;
270             ALTER TABLE public.pai_id_seq OWNER TO hernan;
271             ALTER SEQUENCE pai_id_seq OWNED BY pai.id;
272             SELECT pg_catalog.setval('pai_id_seq', 1, false);
273             ALTER TABLE ONLY amigo ALTER COLUMN id SET DEFAULT nextval('amigo_id_seq'::regclass);
274             ALTER TABLE ONLY filho ALTER COLUMN id SET DEFAULT nextval('filho_id_seq'::regclass);
275             ALTER TABLE ONLY namorada ALTER COLUMN id SET DEFAULT nextval('namorada_id_seq'::regclass);
276             ALTER TABLE ONLY pai ALTER COLUMN id SET DEFAULT nextval('pai_id_seq'::regclass);
277             COPY amigo (id, nome, amigo_id) FROM stdin;
278             \.
279             COPY filho (id, nome, pai_id) FROM stdin;
280             \.
281             COPY namorada (id, nome, amigo_id) FROM stdin;
282             \.
283             COPY pai (id, nome) FROM stdin;
284             \.
285             ALTER TABLE ONLY amigo
286             ADD CONSTRAINT amigo_pkey PRIMARY KEY (id);
287             ALTER TABLE ONLY filho
288             ADD CONSTRAINT filho_pkey PRIMARY KEY (id);
289             ALTER TABLE ONLY namorada
290             ADD CONSTRAINT namorada_pkey PRIMARY KEY (id);
291             ALTER TABLE ONLY pai
292             ADD CONSTRAINT pai_pkey PRIMARY KEY (id);
293             ALTER TABLE ONLY amigo
294             ADD CONSTRAINT amigo_amigo_id_fkey FOREIGN KEY (amigo_id) REFERENCES filho(id);
295             ALTER TABLE ONLY filho
296             ADD CONSTRAINT filho_pai_id_fkey FOREIGN KEY (pai_id) REFERENCES pai(id);
297             ALTER TABLE ONLY namorada
298             ADD CONSTRAINT namorada_amigo_id_fkey FOREIGN KEY (amigo_id) REFERENCES amigo(id);
299             REVOKE ALL ON SCHEMA public FROM PUBLIC;
300             REVOKE ALL ON SCHEMA public FROM postgres;
301             GRANT ALL ON SCHEMA public TO postgres;
302             GRANT ALL ON SCHEMA public TO nixus;
303             GRANT ALL ON SCHEMA public TO PUBLIC;
304              
305              
306             =head2 Como conectar no banco de dados com dbix class
307              
308             Agora que já criamos o banco de dados, devemos criar os models em nossa app para que ela se conecte no banco de dados.
309             Então vamos lá... usaremos a dica "B. Como gerar os models se você já tem o banco de dados, sem catalyst" que diz:
310            
311             dbicdump -o dump_directory=./lib \
312             -o components='["InflateColumn::DateTime"]' \ <-- *** nao obrigatorio
313             -o debug=1 \
314             My::Schema \
315             'dbi:Pg:dbname=foo' \
316             myuser \
317             mypassword
318              
319             Se você não tiver permissão, pode conectar no db com
320            
321             psql tut_dbixclass_perl_orm
322              
323             e depois executar um grant all em todas as tabelas pra um usuario, no meu casi 'webdev'
324              
325             select 'grant all on '||schemaname||'.'||tablename||' to webdev;' from pg_tables where schemaname in ('public') order by schemaname, tablename;
326              
327             faça um select em pg_tables antes para ver quais itens você vai precisar... neste caso é só public
328             e agora vamos criar um diretório para a aplicação
329              
330             mkdir /home/catalyst/tutorial-dbix-class-perl-orm-pt-br/app
331             cd /home/catalyst/tutorial-dbix-class-perl-orm-pt-br/app
332             vim /home/catalyst/tutorial-dbix-class-perl-orm-pt-br/app/app.pl
333              
334             =head2 Dependências
335              
336             Instale o módulos do cpan:
337            
338             DBIx::Class::Schema::Loader #dbicdump (gera os models pra você, com todos os relacionamentos)
339             DBD::Pg #para conectar no banco de dados postgres
340              
341             Talvez você precise daquelas libs de -dev para poder criar o DBD::Pg... ex.
342              
343             postgresql-server-dev-all #ferramentas para desenvolvimento postgres
344              
345             =head2 ERRO#1 - verificando se o comando dbicdump está disponível
346              
347             $ dbicdump
348             The program 'dbicdump' is currently not installed. To run 'dbicdump' please ask your administrator to install the package 'libdbix-class-schema-loader-perl'
349              
350             Primeiro tentei rodar o comando dbicdump diretamente no meu terminal para ver se o mesmo está instalado.
351             Apareceu essa mensagem dizendo que o mesmo não está instalado, porem eu posso instalar pois ele está no repositório do ubuntu (que legal em)
352             Mas, acontece que eu estou utilizando minha versão de perl 5.17.1 (a mais nova) que eu instalei usando "perlbrew" (procure perlbrew) e eu utilizo junto o "cpanm" e assim eu posso instalar módulos sem root no perl. legal pois é mais seguro!!
353              
354             cpanm DBIx::Class::Schema::Loader
355              
356             esse é o módulo que fornece o dbicdump
357              
358             =head2 ERRO#2
359              
360             Após instalar o DBIx::Class::Schema::Loader, Tentei executar o comando dbicdump mas veja o que aconteceu:
361              
362             $ dbicdump -o dump_directory=./lib -o debug=1 DB::Tutorial::DBIx::Class::PT::BR 'dbi:Pg:dbname=tut_dbixclass_perl_orm' username password
363             DBIx::Class::Schema::Loader::make_schema_at(): DBI Connection failed: install_driver(Pg) failed: Can't locate DBD/Pg.pm in @INC (@INC contains: /home/webdev/perl5/perlbrew/perls/perl-5.15.9/lib/site_perl/5.15.9/x86_64-linux /home/webdev/perl5/perlbrew/perls/perl-5.15.9/lib/site_perl/5.15.9 /home/webdev/perl5/perlbrew/perls/perl-5.15.9/lib/5.15.9/x86_64-linux /home/webdev/perl5/perlbrew/perls/perl-5.15.9/lib/5.15.9 .) at (eval 95) line 3.
364             Perhaps the DBD::Pg perl module hasn't been fully installed,
365             or perhaps the capitalisation of 'Pg' isn't right.
366             Available drivers: DBM, ExampleP, File, Gofer, Proxy, SQLite, Sponge.
367             at /home/webdev/perl5/perlbrew/perls/perl-5.15.9/lib/site_perl/5.15.9/DBIx/Class/Storage/DBI.pm line 1249. at /home/webdev/perl5/perlbrew/perls/perl-5.15.9/bin/dbicdump line 178
368              
369             Isto quer dizer que não tem instalado o DBD::Pg, que é o módulo que vai permitir nossa conexão com o banco de dados Postgres. O erro aparece na linha acima, nesta parte:
370              
371             Can't locate DBD/Pg.pm in @INC
372              
373             Quer dizer que não localizou o módulo DBD/Pg e esse módulo é uma dependência necessária para essa ação:
374            
375             DBIx::Class::Schema::Loader::make_schema_at(): DBI Connection failed
376              
377             Ou seja, tentou executar metodo:
378            
379             make_schema
380              
381             no módulo
382            
383             DBIx::Class::Schema::Loader
384              
385             e resultou em:
386              
387             DBI Connection failed
388              
389             pelo motivo
390              
391             install_driver(Pg) failed: Can't locate DBD/Pg.pm in @INC
392              
393             =head2 Arrumando ERRO#2 (Instalando DBD::Pg)
394              
395             Quando tentei rodar o dbicdump, eu havia instalado minha versão perl com perlbrew recentemente e nem tinha instalado o DBD::Pg ainda... por isso resultou no erro #2.
396             Então vou instalar o módulo DBD::Pg assim:
397              
398             $ cpanm DBD::Pg
399             --> Working on DBD::Pg
400             Fetching http://www.cpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-2.19.2.tar.gz ... OK
401             Configuring DBD-Pg-2.19.2 ... OK
402             Building and testing DBD-Pg-2.19.2 ... OK
403             Successfully installed DBD-Pg-2.19.2
404             1 distribution installed
405              
406             =head2 ERRO#4 Usuário sem permissão no banco de dados
407              
408             $ dbicdump -o dump_directory=./lib -o debug=1 DB::Tutorial::DBIx::Class::PT::BR 'dbi:Pg:dbname=tut_dbixclass_perl_orm' username password
409             DBIx::Class::Schema::Loader::make_schema_at(): DBI Connection failed: DBI connect('dbname=tut_dbixclass_perl_orm','username',...) failed: FATAL: Peer authentication failed for user "username" at /home/webdev/perl5/perlbrew/perls/perl-5.15.9/lib/site_perl/5.15.9/DBIx/Class/Storage/DBI.pm line 1249. at /home/webdev/perl5/perlbrew/perls/perl-5.15.9/bin/dbicdump line 178
410              
411             Dê permissão ao seu usuário no banco de dados atraves do comando grant
412              
413             grant all on database tut_dbixclass_perl_orm to username;
414              
415             =head2 ERRO#5 Usuário sem permissão de select
416              
417             $ dbicdump -o dump_directory=./lib -o debug=1 DB::Tutorial::DBIx::Class::PT::BR 'dbi:Pg:dbname=tut_dbixclass_perl_orm' username webdev123
418             Bad table or view 'amigo', ignoring: DBIx::Class::Schema::Loader::make_schema_at(): DBI Exception: DBD::Pg::st execute failed: ERROR: permission denied for relation amigo [for Statement "SELECT * FROM "public"."amigo" WHERE ( 1 = 0 )"] at /home/webdev/perl5/perlbrew/perls/perl-5.15.9/bin/dbicdump line 178
419              
420             dê permissão de select nas tabelas para seu usuário:
421              
422             grant all on public.pai to username;
423              
424             =head2 Quando o dbicdump dá certo voce vê:
425              
426             $ dbicdump -o dump_directory=./lib -o debug=1 DB::Tutorial::DBIx::Class::PT::BR 'dbi:Pg:dbname=tut_dbixclass_perl_orm' username password
427             DB::Tutorial::DBIx::Class::PT::BR::Result::Amigo->table("amigo");
428             DB::Tutorial::DBIx::Class::PT::BR::Result::Amigo->add_columns(
429             "id",
430             {
431             data_type => "integer",
432             is_auto_increment => 1,
433             is_nullable => 0,
434             sequence => "amigo_id_seq",
435             },
436             "nome",
437             { data_type => "text", is_nullable => 1 },
438             "amigo_id",
439             { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
440             );
441             DB::Tutorial::DBIx::Class::PT::BR::Result::Amigo->set_primary_key("id");
442             DB::Tutorial::DBIx::Class::PT::BR::Result::Filho->table("filho");
443             DB::Tutorial::DBIx::Class::PT::BR::Result::Filho->add_columns(
444             "id",
445             {
446             data_type => "integer",
447             is_auto_increment => 1,
448             is_nullable => 0,
449             sequence => "filho_id_seq",
450             },
451             "nome",
452             { data_type => "text", is_nullable => 1 },
453             "pai_id",
454             { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
455             );
456             DB::Tutorial::DBIx::Class::PT::BR::Result::Filho->set_primary_key("id");
457             DB::Tutorial::DBIx::Class::PT::BR::Result::Namorada->table("namorada");
458             DB::Tutorial::DBIx::Class::PT::BR::Result::Namorada->add_columns(
459             "id",
460             {
461             data_type => "integer",
462             is_auto_increment => 1,
463             is_nullable => 0,
464             sequence => "namorada_id_seq",
465             },
466             "nome",
467             { data_type => "text", is_nullable => 1 },
468             "amigo_id",
469             { data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
470             );
471             DB::Tutorial::DBIx::Class::PT::BR::Result::Namorada->set_primary_key("id");
472             DB::Tutorial::DBIx::Class::PT::BR::Result::Pai->table("pai");
473             DB::Tutorial::DBIx::Class::PT::BR::Result::Pai->add_columns(
474             "id",
475             {
476             data_type => "integer",
477             is_auto_increment => 1,
478             is_nullable => 0,
479             sequence => "pai_id_seq",
480             },
481             "nome",
482             { data_type => "text", is_nullable => 1 },
483              
484             ... e nada de erros.
485              
486             =head2 Agora precisamos arrumar alguns relacionamentos
487              
488             O DBIx::Class fala ingles por padrao.. então quando ele detectar e criar os relacionamentos para você, ele vai colocar os plurais em ingles. Então precisamos verificar e consertar essas inconsistências.
489              
490             Então vamos editar os models do dbixclass que estão dentro do diretório:
491              
492             app/lib/DB/Tutorial/DBIx/Class/PT/BR/Result/*
493             app/lib/DB/Tutorial/DBIx/Class/PT/BR/Result/Amigo.pm
494             app/lib/DB/Tutorial/DBIx/Class/PT/BR/Result/Filho.pm
495             app/lib/DB/Tutorial/DBIx/Class/PT/BR/Result/Pai.pm
496              
497             Primeiro edite o Filho.pm la no final, *após* a linha DO NOT MODIFY THIS OR ANYTHING ABOVE coloque:
498             Não altere essa linha e nem o conteudo acima dela. Tudo que você escrever após essa linha vai sobrepor o que foi declarado em cima. A parte que está em cima pode ser sobre-escrita/atualizada se você rodar um comando para atualizar os campos do banco de dados por exemplo. Então se você mexer ali, o dbix class vai se perder, então evite mexer ali para não ter problemas.
499             Sempre mexa após essa linha:
500              
501             # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:aaQcKvggMUd5YmFttR/eYw
502              
503             __PACKAGE__->has_many(
504             "amigos",
505             "DB::Tutorial::DBIx::Class::PT::BR::Result::Amigo",
506             { "foreign.amigo_id" => "self.id" },
507             { cascade_copy => 0, cascade_delete => 0 },
508             );
509              
510              
511             agora o arquivo Pai.pm
512              
513             # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:B4I5N4/abdMhSMNWiYJFJQ
514              
515             __PACKAGE__->has_many(
516             "filhos",
517             "DB::Tutorial::DBIx::Class::PT::BR::Result::Filho",
518             { "foreign.pai_id" => "self.id" },
519             { cascade_copy => 0, cascade_delete => 0 },
520             );
521              
522              
523             agora sim, alteramos de filhoes para filhos. E amigoes para amigos.
524             bem melhor pois fica mais natural.
525              
526             =head2 Como criar a aplicação com dbix class e conexão com banco de dados postgres
527              
528             Veja a dica #C deste tutorial e crie um diretório para sua aplicação e edite um arquivo.pl para inserir o seguinte código de exemplo:
529             Este código conecta no banco de dados utilizando postgres, e insere 1 pai, 1 filho, 1 amigo e uma namorada pro amigo.
530             Abaixo está a saída dos comandos executados.
531             Para executar o script digite no terminal:
532              
533             $ export DBIC_TRACE=1 && perl app.pl
534              
535             Segue o codigo fonte:
536              
537             use lib ( "./lib" );
538             use DB::Tutorial::DBIx::Class::PT::BR;
539             my $schema = DB::Tutorial::DBIx::Class::PT::BR->connect(
540             'dbi:Pg:dbname=tut_dbixclass_perl_orm',
541             'webdev',
542             'webdev123'
543             );
544             my $pai = $schema->resultset('Pai')->new({ nome => 'joao' });
545             $pai->insert;
546             warn $pai->nome;
547             my $filho = $pai->add_to_filhos( { nome => 'filho 1' } );
548             warn $filho->nome;
549             my $amigo = $filho->add_to_amigos( {
550             nome => 'Nome amigo1',
551             } );
552              
553             my $namorada = $amigo->add_to_namoradas( {
554             nome => 'Maria'
555             } );
556              
557             warn $namorada->nome;
558             warn $namorada->id;
559              
560             Saida do codigo acima:
561              
562             INSERT INTO pai ( nome) VALUES ( ? ) RETURNING id: 'joao'
563             joao at app.pl line 10.
564             INSERT INTO filho ( nome, pai_id) VALUES ( ?, ? ) RETURNING id: 'filho 1', '23'
565             filho 1 at app.pl line 12.
566             INSERT INTO amigo ( amigo_id, nome) VALUES ( ?, ? ) RETURNING id: '6', 'Nome amigo1'
567             INSERT INTO namorada ( amigo_id, nome) VALUES ( ?, ? ) RETURNING id: '3', 'Maria'
568             Maria at app.pl line 21.
569             2 at app.pl line 22.
570              
571             =head2 Autor
572              
573             Hernan Lopes < hernanlopes gmail >
574             cpan: http://search.cpan.org/~hernan/
575             github: http://github.com/hernan604/
576              
577             Escrevam para eu saber se está ficando legal, ou como posso melhorar!
578             Obg,
579             -Hernan Lopes
580              
581              
582             1;
583             # The preceding line will help the module return a true value
584