banco de dados em perl

Iniciado por C00L3R, 15 de Dezembro , 2008, 01:14:10 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

C00L3R

Banco de Dados em Perl
feito por C00L3R     data:14/12/08

FAz tempo que não entro no MSN ou no IRC devido a dias de estudo os nossos
amigos Dr4k3 e _Mlk_ sabe como estudo direto quando tenho tempo eu presto serviços
de freelancer com o Gordon no http://4call.tk. A Semanas que ando estudando Banco de dados
em perl acabei chegando a este artigo para explicar como nidar com alguns módulos de banco
de dados em Perl demorei um tempo por causa dos inumeros testes que fazia e para piorar
o material que tem de DB em perl é todo ingles os em portugues dificilmente da para achar
algo que preste ou seja não achei nada em portugues, para explicar melhor este paper em PT
sobre banco de dados em Perl que vocêis estão lendo pode ser unico sobre DBM,DBI,Class::DBI...

Por que DBM e SQLite ?

Continuando fiz testes no meu laborátorio com MySQL,SQLite e DBM com benchMark
para quem não sabe benchmark seria um módulo do perl para ajudar a contar o tempo
de um processo entre outras coisas,fiz varios testes para ver qual que tem mais desempenho
para coisas simples como quardar um array de nomes e mostrar em forma alfabetica com sort
do tipo pilha,fila entre outros. tive resultados significantes com DBM e SQLite por
isso estou usando os mesmos neste artigo e ensino a usar passo a passo.No caso do uso
Do SQLite com módulo "DBI" e Módulo "Class::DBI" tambem podemos usar outros SGBDs como MySQL
com base deste artigo.

Muitos programadores iniciantes tem medo de SGBDs e da palavra DB
devido a fãma dos diagramas dificeis projetos entre outras coisas.
Mas na realidade não é assim tem coisas complicadas em BD tem sim mas
situação destas são dificeis,Em casos simples por exemplo você quer
fazer uma agenda para sua empresa ou um blog até mesmo um quest book
não vai precisar fazer coisas complicadas...

Este artigo tem como méta tirar o medo de Banco de dados dos programadores
em perl em geral e apresentar alguns módulos para nidar com Banco de dados.

Vamos iniciar
O que é banco de dados ?
Banco de Dados é um sistema de armazenamento de Dados baseado em computador
cujo objetivo é registrar e manter informações consideradas significativas...
Alguns atende Banco de dados pela sigla DB(database).

O Que é SGBD ?
Sistema Gerenciador de Banco de Dados populares MySQL,Oracle,PostgreSQL,MSQL...

O Que é SQL ?

Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL que foi criada pela IBM
inspirada em álgebra relacional,obviamente pela facilidade de fazer buscas em SQL entre outros
fatos vários SGBDs preferem SQL assim como MySQL,Oracle,PostreSQL...
Ou seja se você sabe SQL ja tem 60% do caminho andado os outros 40% são comandos próprios dos
SGBDs e configs..

Agora que ja damos uma revisada vamos iniciar,Bem neste artigo vou usar Berkeley DB e SQLite
por dois motivos,Primeiro são mais rapidos ,Segundo são mais faceis de instalar e não leva tempo
porem eles não tem filosofia de uso igual assim como MySQL,Oracle e outros SGBDs vou explicar.

Oracle Berkeley DB é uma família de bancos de dados de código aberto que permite aos desenvolvedores incorporar
em seus aplicativos um engine de banco de dados transacional rápido e escalável, com confiabilidade e disponibilidade
de nível industrial.Em outras palavras Berkeley DB seria um Modulo DBM(arquivo de tabelas residuais) quardadas em uma
HASH por este fato DBM tem muitas vantagens sobre arquivos textos, voudar um exemplo de programa que fiz com DBM
uma agenda eletronica em Perl com varios comandos usando modulo "DB_File";

#!/usr/bin/perl
# program name: Programa agenda eletronica
# Portabilite: all operational  systems
# Database: Berkeley database
# Author: C00L3R
# This program licensed BSD
#################----> iniciando alguns modulos
use utf8;
use warnings;
use DB_File;
#################----> definindo variaveis
$banco="data.dbm";
$password="cooler";
@numbers=("0","1","2","3","4","5","6","7","8","9");
#################----> sistem of clean screen, ALL operational systems
my $sis="$^O";
if ($sis eq MSWin32) { $cmd="cls"; } else { $cmd="clear"; }
inicio: print `$cmd`;
#################----> Banner start
logo();
#################----> pegando entrada do cliente
while(<STDIN>) {
if($_ =~ /[1-5]{1}/) {
  print "OK numero digitado corretamente, abrindo escolha $_ \n";
  sleep 2; last;
  } else { print "Ops numero digitado errado\ndigite outro numero\n"; }
}
chomp($escolha=$_);
#################----> colocando dados na database
if("$escolha"eq"1") {
print "----------------------------------\ncadastrando contato na agenda\n";
print "digite um nome para o cadastro\n"; chomp($nome=<STDIN>);
print "digite local do contato\n"; chomp($local=<STDIN>);
print "digite cidade do contato\n"; chomp($cidade=<STDIN>);
print "digite telefone do contato\n"; chomp($telefone=<STDIN>);
$resposta="$nome:$local:$cidade:$telefone";
geracodigo:
$num1=rand(@numbers); $n1= $numbers[$num1];
$num2=rand(@numbers); $n2= $numbers[$num2];
$num3=rand(@numbers); $n3= $numbers[$num3];
$num4=rand(@numbers); $n4= $numbers[$num4];
$num5=rand(@numbers); $n5= $numbers[$num5];
$num6=rand(@numbers); $n6= $numbers[$num6];
$codigo="$n1$n2$n3$n4$n5$n6";
tie (%hash, 'DB_File', $banco) or die "erro no banco data.dbm': $!\n";
while(($chave,$valor) = each %hash) {
  if($chave =~ /$codigo/) { goto geracodigo; }
}
$hash{"$codigo"} = "$resposta";
print "cadastro colocado na agenda\n"; sleep 5; goto inicio;   
}
#################----> remover linha da database
if("$escolha"eq"2") {
print "digite um nome de cadastrado para remover da agenda\n"; chomp($busca=<STDIN>);
tie (%hash, 'DB_File', $banco) or die "erro no banco data.dbm': $!\n";
while(($chave,$valor) = each %hash) {
  if($valor =~ /$busca/) {
   @triad=split(/:/,$valor);
   print "-------------------------------------\n";
   print "Nome : "."$triad[0]\n";
   print "Local : "."$triad[1]\n";
   print "Cidade : "."$triad[2]\n";
   print "Tellefone : "."$triad[3]\n";
   print "--------------------------------------\ndeseja remover este cadastro? Nao ou Sim\n";
   chomp($opcao=<STDIN>);
   if($opcao =~ /[Nao|nao|n|N]/) { print "voltando\n"; sleep 2; goto inicio; }
   else { delete $hash{$chave}; print "removido\n"; }
  }
}
untie %hash; print "--------------------------\nvoltando\n"; sleep 5; goto inicio;
}
#################----> procurando algo na database
if("$escolha"eq"3") {
print "digite um nome para procurar na agenda\n"; chomp($busca=<STDIN>);
tie (%hash, 'DB_File', $banco) or die "erro no banco data.dbm': $!\n";
while(($chave,$valor) = each %hash) {
  if($valor =~ /$busca/) {
  @triad=split(/:/,$valor);
   print "-------------------------------------\n";
   print "Nome : "."$triad[0]\n";
   print "Local : "."$triad[1]\n";
   print "Cidade : "."$triad[2]\n";
   print "Tellefone : "."$triad[3]\n";
  }
}
untie %hash; print "voltando\n"; sleep 5; goto inicio;
}
#################----> vendo database
if("$escolha"eq"4") {
print "Listando cadastros da agenda\n";
tie (%hash, 'DB_File', $banco) or die "erro no banco data.dbm': $!\n";

#while(($chave,$valor) = each %hash) {
foreach $value (sort values %hash) {
@triad=split(/:/,$value);
  print "-------------------------------------\n";
  print "Nome : "."$triad[0]\n";
  print "Local : "."$triad[1]\n";
  print "Cidade : "."$triad[2]\n";
  print "Tellefone : "."$triad[3]\n";
}
untie %hash;
print "voltando\n"; sleep 10;
goto inicio;
}
#################----> exit program
if("$escolha"eq"5") { print "saindo\n"; sleep 3; exit; }
#################----> banner function
sub logo() {
print q{

+-------------------------------------------------------------+
|                       AGENDA ELETRONICA                     |
|                Usando berkeley DataBase                     |
+-------------------------------------------------------------+
|               1 Adicionar cadastro na agenda                |
|               2 Remover cadastro da agenda                  |
|               3 Procurar cadastros na agenda                |
|               4 Listar cadastros da agenda                  |
|               5 Sair da Agenda                              |
+-------------------------------------------------------------+
                     Version 0.5 By C00L3R
}}


Com esta agenda ja da para você usar DBM nos seus programas de forma rapida e facil
melhor forma de estudar e encarando o modulo indo no CPAN ver o modulo interpretando
os programas mudando algumas coisas e testando...
informações do Berkeley DB http://www.oracle.com/global/br/database/berkeley-db/index.html

Agora vamos para o SQLite.

O que é SQLite ?

SQLite é uma biblioteca C que implementa um banco de dados SQL embutido ou seja
SQLite é o servidor. A biblioteca SQLite lê e escreve diretamente para o arquivo
do banco de dados no disco.

Por que vamos usar SQLite?
SQLite foi escolhido para este artigo por não necessitar de
configurações complicadas e por sua instalação ser rapida e limpa...
Suporta bases de dados acima de 2 terabytes,O Banco de Dados é guardado em um único arquivo
e Sem dependências externas e outros motivos,É facil exportar dados,por ser rapido...

Como instalar ?
caso use windows ou queira instalar direto do tarball http://www.sqlite.org
linux debianos em geral "apt-get install sqlite",Slackers installpkg sqlite3_bla_bla.tgz
chapeis vermelhos e azuis "yum install sqlite",Daemons,puffers procure nos ports.

Como crio um banco de dados ?
sqlite /local_que_quiser/banco.db
pronto feito isso você caira no console do SQLite veja no meu caso estou usando SQLite3
[Cooler@localhost ~]$ sqlite3 teste.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite>

no console que você executa os comandos SQL vou mostrar alguns comandos para usar no SQLite
e em outros SQGBDs como MySQL...

vamos ver uma lista de comandos que fiz para estudo

# Lista de COmandos simples do SQLite
###################################################
# para criar um banco podemos usar o comando "sqlite3 nosso_banco.db"
# comando ".table" lista tabelas que tem no sistema
# comando ".schema" lista comandos dados no sistema
# coamndo ".help" lista demais comandos e suas funcoes
# ".read coisas.sql"  executa comandos SQL de um arquivo
# Comando ".mode column" muda o modo de exibicao para colunas
##############################################################

############ COMANDOS SQL
# Listar dados de uma determinada tabela
# tambem podemos usar "limit" para limitar nossa busca "limit 2 "
SELECT * FROM nome_tabela
SELECT * FROM nome_tabela limit 5
# listar dois valores de uma determinada tabela
SELECT nome, tel FROM tabela;
# listar dados em ordem alfabetica
SELECT nome,tel FROM agenda ORDER BY nome;
# listar dados baseado em uma palavra
SELECT nome FROM agenda WHERE nome LIKE 'discoteca%';

# Criar uma tabela e determinar dados para serem armazenados
create table t1 (t1key INTEGER PRIMARY KEY, data TEXT,num DOUBLE,
timeEvent DATE);
# Ou que tal
CREATE TABLE nome_tabela (
nome VARCHAR(50),
telefone VARCHAR(10) #alfanumericos com até 10 caracteres
cep INT(8) #numeros com ateh 8 digitos
);

# Deletar uma tabela
DROP TABLE nome_tabela

# inserir dado na tabela
INSERT INTO t1 (data, num) VALUES ('Isto 'e um exemplo de texto', 3);
# ou inserindo de forma simples
INSERT INTO nome_tabela VALUES ("teste")"
# inserindo dois dados
INSERT INTO agenda(nome,tel) VALUES ('Bombeiros', '193');

# remover um determinado dado na tabela
DELETE FROM nome_tabela WHERE nome="teste";



Agora que ja brincamos com nosso "SQLite" e ja temos uma noção de SQL
claro que é bom você dar uma estudada tambem ALA GOOGLE! por que SQL é muita coisa mesmo
mas se não saber tudo relax que tem uma solução la no final do artigo então continue.

Mas como usar Bancos SQL no Perl?
Para tal feito podemos usar o Modulo "DBI" e "Class::DBI"
bem modulo DBI é a raiz dos outros módulos de banco de dados inclusive do "Class::DBI"
no CPAN se resume em baixar o seu driver e ja conectar no banco de dados
No nosso caso como queremos conectar no "SQLite" vamos usar o driver
"DBD::SQLite" instalamos ele pelo Shell do CPAN mesmo, usuários da
janelinha vão ter que usar um package manager...
algumas imagens para explciar o funcionamento do DBI

_______         ____________         __________
|       |       |            |       |          |  Processa comando
|  DBI  |======>| Driver DBD |======>|  SQLite  |  mesmo vale para outros drivers..
|_______|       |____________|       |__________|  a teoria para outros SGBDs é a mesma

 
vamos continuar, instalado os módulos "DBI" e "DBD::SQLite" vamos abrir o banco
e preparar ele para nosso programa
#SQlite3 banco.db
>CREATE TABLE cadastro (
>nome VARCHAR(50),
>);
>.q


depois crie o programa na mesma pasta exemplo "banco.pl"

#!/usr/bin/perl
#Chamamos o Módulo
use DBI;
################ Banner
inicio: print `clear`;
logo();
chomp(my $escolha=<STDIN>);
#Conectando no SQLite
my $dbh=DBI->connect("dbi:SQLite:dbname=banco.db");
#se fosse my SQL seria
# $dbh = DBI->connect("DBI:mysql:database=$database;host=$host", "$usuario", "$senha");
if($escolha eq "1"){
print "digite nome do dado para inserir\n";
chomp(my $dado=<STDIN>);
#dando comando no banco muito cuidado é bom tratar a variavel do cliente com regex antes d eexecutar ;)
$dbh->do("INSERT INTO cadastro VALUES (\"$dado\")");
print "dado inserido com sucesso\n";
goto inicio;
}

if($escolha eq "2"){
print "digite nome do dado para remover\n";
chomp(my $dado=<STDIN>);
$dbh->do("DELETE FROM nome cadastro WHERE nome=\"$dado\"");
print "dado removido com sucesso\n";
goto inicio;
}

if($escolha eq "3"){
print "listando tabela\n";
my $sth=$dbh->prepare("SELECT * FROM cadastro");
$sth->execute();
while (($name)=$sth->fetchrow_array) {
  print "$name\n";
}
$sth->finish();
sleep 5;
print "Comando executado com suesso\n";
goto inicio;
}

if($escolha eq "4"){
# Desconectando do banco
$dbh->disconnect; exit; }

sub logo() {
print q{
+-----------------------------------------------+
|              SQLite DB Agenda 0.1             |
|-----------------------------------------------|
| 1- Inserir dado em uma tabela                 |
| 2- Remover dado de uma tabela                 |
| 3- Listar dados de uma tabela                 |
| 4- Sair                                       |
+-----------------------------------------------+
by C00L3R
Escolha um numero

}}


Temos um programa simples para tal feito rapidamente, e se você tem dificuldade com comandos SQL
você pode tentar usar o "CLass::DBI" vou dar um exemplo mas antes crie a tabela no nosso "banco.db"
#SQlite3 banco.db
>CREATE TABLE agenda (
>nome VARCHAR(50),
>telefone INT(20),
>cidade VARCHAR(50)
>);
>.q


feito isso crie um class.pl

mas antes instale o módulo "Class::DBI" pelo CPAN ou outro lugar...

conteudo do arquivo deve ser este
#!/usr/bin/perl
# Carregando Modulos
use strict;
use Class::DBI;
inicio: print `clear`;
print <<EOF;
                   By C00L3R
+------------------------------------------------+
|  Agenda Eletronica Usando Class DBI e  SQLite  |
|------------------------------------------------|
| 1 Inserir cadastro                             |
| 2 Remover cadastro                             |
| 3 Listar cadastros                             |
| 4 Procurar cadastro                            |
| 5 Sair do programa                             |
+------------------------------------------------+
             digite um numero
EOF
chomp(my $escolha=<STDIN>);
#definindo objetos conectando na tablela e no banco
package Agenda;
  use base qw(Class::DBI::SQLite);
  __PACKAGE__->set_db('Main', 'dbi:SQLite:dbname=banco.db', '', '');
  __PACKAGE__->table('agenda');
  __PACKAGE__->columns(All => qw/nome telefone cidade/);

if($escolha eq "1"){
print "digite um nome\n"; chomp(my $nome=<STDIN>);
print "digite um telefone\n"; chomp(my $telefone=<STDIN>);
print "digite um cidade\n"; chomp(my $cidade=<STDIN>);
# inserindo dados nem precisa manjar SQL olha só que beleza
  my $agenda = Agenda->insert({
    nome => "$nome",
    telefone => "$telefone",
    cidade => "$cidade",
  });
goto inicio;
}

if($escolha eq "2"){
print "digite um nome para deletar da lista\n"; chomp(my $nome=<STDIN>);
Agenda->search(nome => "$nome")->delete_all;
goto inicio;
}
if($escolha eq "3"){
for my $cadastro ( Agenda->retrieve_all) {
print "-------------------------\n", $cadastro->nome,"\n",$cadastro->telefone,"\n",$cadastro->cidade,"\n";
}
sleep 6; goto inicio;
}

if($escolha eq "4"){
print "digite um nome para procurar na agenda\n"; chomp(my $nome=<STDIN>);
my @agenda=Agenda->search(nome => "$nome");
foreach my $cadastro (@agenda) {
print "-------------------------\n", $cadastro->nome,"\n",$cadastro->telefone,"\n",$cadastro->cidade,"\n";
}
sleep 4; goto inicio;
}
if($escolha eq "5"){ exit; }


Nesta  simples agenda vimos que "CLass::DBI" pode ser muito mais simples que o uso do módulo "DBI" e para quem não domina SQL pode ser uma grande opção usar "Class::DBI" para ver mais comandos deste módulo de comando "perldoc Class::DBI" tarefas avançadas podemos fazer com ambos mas vai de cada um.
veja aqui uma agenda mais completa http://www.perl.com/pub/a/2002/11/27/classdbi.html

Bem "DB_FIle","CLass::DBI" e "DBI" são maravilhosos módulos para trabalhar com Bancos em Perl cabe a você escolher
o melhor para você outros exemplos de DBI você pode dar o comando "perldoc DBI" para ver a documentação..
demorei muito para postar este artigo mas em fim ele esta ai...

dedico este artigo aos iniciantes Brasileiros do Perl que não comprendem ingles...
meu ingles é ruin mas ta dando pro gasto HiHI HErhErhErh by beavis and butthead