Desenvolvimento - Python

Gerenciando registros em banco de dados com Zope

Hoje em dia trabalharmos com banco de dados está cada vez mais freqüente e por isso mostrarei como utilizar o Zope para gerenciar os dados de seu SGBD preferido.

por Fábio Rizzo Matos



Introdução

Hoje em dia trabalharmos com banco de dados está cada vez mais freqüente e por isso mostrarei como utilizar o fantástico Zope para gerenciar os dados de seu SGBD preferido.

Para visualizarmos o conteúdo de uma tabela devemos ter uma conexão com o banco de dados. No artigo Instalando o MySQL no Zope/Plone e criando uma pequena aplicação foi mostrado como fazê-lo.

Acessando http://www.zope.org/Products você pode baixar outros "Database Adapters" para seu banco de dados preferido.

Neste artigo partiremos do princípio que você já tem uma conexão com o banco de dados.

Crie uma tabela chamada ramais. A seguir o comando SQL usado para criar essa tabela no MySQL:

CREATE TABLE ramais (
cod INT(11) AUTO_INCREMENT PRIMARY KEY NOT NULL,
usuario VARCHAR(100), 
unidade VARCHAR(100),
ramal VARCHAR(100), 
radio VARCHAR(100),
celular VARCHAR(100),
email VARCHAR(100) 
);  

Visualizando o conteúdo de uma tabela

Para visualizarmos o conteúdo de uma tabela, basta criarmos alguns objetos. Eles são:
ZSQL Method: Para realizar a query;
Z Search Interface: Para criar a página que vai exibir os resultados de sua consulta.

Crie uma Zsql Method:

id = zsql_select
arguments =
title = Comando SQL para visualizar tabela
query template = select * from ramais

e clique em "add and test".

Uma segunda janela vai aparecer com o botão "Submit Query". Clique nele e veja o resultado de sua query de select.

Este teste vai mostrar o conteúdo da tabela ramais e seus respectivos campos.

Agora voltando ao console do zope(ZMI) , crie um objeto do tipo "Search Interface" clicando em add "Z Search Interface".

Um janela vai aparecer como esta abaixo:

Onde: Select one or more searchable objects - É o local onde iremos buscar os comandos SQL já criados para gerar o formulário.
Report Id - O nome do relatório
Report title - O título do relatório.
Report Style - O Estilo do Relatório
Search Input Id - Caso queira um critério na busca.
Seach Input Title - O título do critério de busca.
Gerar DTML Method ou Page Templates - São as formas de criar methods. Neste caso iremos criar DTML Methods.

Pronto. Clique em "add". Agora acesse pelo browser esta página e você verá os resultados do banco de dados.

Visualizando o conteúdo de uma tabela utilizando um critério

Neste exemplo criaremos um formulário para pesquisar todos os ramais de um determinado usuário.

Crie um documento para realizar a busca, agindo como um formulário. Dê a ele o nome de index_html com o seguinte conteúdo:

<FORM action="." method=get>
<P>Digite o Nome da Pessoa que você quer saber o ramal.</P>
<P></P>
<TABLE>
<TBODY>
<TR>
<TH>Nome</TH>
<TD><INPUT name=Usuario width="30"></</TD>
</TR>
<TR>
<TH></TH>
<TD><INPUT type=submit value="Pesquisar Ramal" name=template:method> </TD>
</TR>
<TR>
<TH></TH>
<TD><INPUT type=submit value="Incluir Novo Ramal" name=f_insere_ramal:method> </TD>
</TR>
</TBODY>
</TABLE></FORM>  

Se vocês repararem, existe um botão para incluir um novo ramal que usaremos daqui a pouco.

Criaremos um zsql com o:
id = procura_ramal
connectio_id = a sua conexão com o banco de dados
Arguments = Usuário
query = select * from ramais where Usuario LIKE <dtml-sqlvar ""%" + Usuario + "%"" type=string> Agora criaremos um dtml-method para visualizar os resultados. Ele deverá ser chamado de template, e terá o seguinte código:

<dtml-var standard_html_header>
<dtml-in procura_ramal size=20 start=query_start>
   <dtml-if sequence-start>

      <dtml-if previous-sequence>

        <a href="&dtml-URL; &dtml-sequence-query; 
query_start=&dtml-previous-sequence-start-number;">
        (Previous <dtml-var previous-sequence-size> results)
        </a>

      </dtml-if previous-sequence>

<h2>Buscando <dtml-var Usuario> em <dtml-in zsql_contagem_ramais><dtml-var 
contagem></dtml-in> Ramais Cadastrados</h2>
<h4>Sua Busca Retornou <dtml-in procura_ramal_conta><dtml-var 
contaresultado></dtml-in> Ramal(is)</h4><br>
      <table border>
        <tr>
          
          <th>Usuario</th>
          <th>Unidade</th>
          <th>Ramal</th>
          <th>Radio</th>
          <th>Celular</th>
          <th>Email</th>
          <th></th>
        </tr>
      
   </dtml-if sequence-start>

        <tr>
          
          <td><dtml-var usuario null=""></td>
          <td><dtml-var unidade null=""></td>
          <td><dtml-var ramal null=""></td>
          <td><dtml-var radio null=""></td>
          <td><dtml-var celular null=""></td>
          <td><a href="mailto:<dtml-var email null="">"><dtml-var 
email></a></td>
          <td><a href="template_altera_ramal?Cod=<dtml-var cod>&usuario=<dtml-var 
usuario>&unidade=<dtml-var unidade>&ramal=<dtml-var ramal>&radio=<dtml-var 
radio>&celular=<dtml-var celular>&email=<dtml-var email>"><img 
src="edit_icon"></a></td>
        </tr>

   <dtml-if sequence-end>

      </table>
      <dtml-if next-sequence>

         <a href="&dtml-URL; &dtml-sequence-query; 
query_start=&dtml-next-sequence-start-number;">
         (Next <dtml-var next-sequence-size> results)
         </a>

      </dtml-if next-sequence>
   </dtml-if sequence-end>

<dtml-else>

  <br><font size="5" face="verdana">Não foi encontrado nenhum ramal com o nome 
<b><dtml-var Usuario></b></font>
  <br>
  <br>
</dtml-in>
  
</table>
<p><strong></strong> </p>
<dtml-var standard_html_footer>  

Como vocês podem ver, este código já deixa um link para podermos editar as informações dos ramais já adicionados.

Agora, você já pode buscar os ramais cadastrados. Vamos ver como inserimos ramais.

Inserindo um novo ramal

Vamos criar um dtml-method chamado form_insere_ramal com o seguinte código:

<FORM action="." method=post>
<h1>Coloque as informações do Usuário a ser cadastrado</h1><br>
<TABLE>
<TBODY>
<TR>
<TH>Nome</TH>
<TD><INPUT name=Usuario width="50" value=""></TD>
</TR>
<TR>
<TH>Unidade</TH>
<TD><INPUT name=Unidade width="50" value=""></TD>
</TR>
<TR>
<TH>Ramal</TH>
<TD><INPUT name=Ramal width="30" value=""></TD>
</TR>
<TR>
<TH>Radio</TH>
<TD><INPUT name=Radio width="30" value=""></TD>
</TR>
<TR>
<TH>Celular</TH>
<TD><INPUT name=Celular width="30" value=""></TD>
</TR>
<TR>
<TH>Email</TH>
<TD><INPUT name=Email width="50" value=""></TD>
</TR>
<TR>
<TH></TH>
<TD><INPUT type=submit value="inserir" name="q_inclui_ramal:method"></TD>
</TR>
</TBODY>
</TABLE>
</FORM>  

Crie um z sql com o nome de ... com as seguintes informações:

id = sql_inclui_ramais
arguments = Usuario Unidade Ramal Radio Celular Email
query= insert into ramais (usuario,unidade,ramal,radio,celular,email) values ("<dtml-var
Usuario>","<dtml-var Unidade>","<dtml-var Ramal>","<dtml-var
Radio>","<dtml-var Celular>","<dtml-var Email>")

Como vocês podem ver, o uso do <dtml-var Usuário> busca a informação do formulário com o nome Usuário, o que faz você compreender que quando quiser ver a informação passada através de um form, basta você utilizar o <dtml-var campodoform> que o zope irá mostrar a você esta informação.

E por fim, crie um dtml-method com o nome de q_insere_ramal com o seguinte código:

 
<h2>Registro Incluído com Sucesso!</h2>

<dtml-call sql_inclui_ramais>

<br>

<FORM action=http://localhost method=get>

<INPUT type=submit value="OK" name=SUBMIT>

</FORM>  

Pronto! Ao chamar a página form_insere_ramal, poderemos incluir ramais no banco de dados.

Vamos ver como atualizar e deletar as informações.

Atualizando e deletando as informações de uma tabela

Vamos começar a complicar um pouco. Criaremos um dtml-method com o nome de form_altera_ramal. Este form além de alterar as informações, deleta as informações.

<FORM action="." method=get>
<h1>Altere as informações do Usuário em Questão</h1><br>
<TABLE>
<TBODY>
<TR>
<TH>Nome</TH>
<TD><INPUT name=Usuario width="50" value="<dtml-var usuario>"></TD>
</TR>
<TR>
<TH>Unidade</TH>
<TD><INPUT name=Unidade width="50" value="<dtml-var unidade>"></TD>
</TR>
<TR>
<TH>Ramal</TH>
<TD><INPUT name=Ramal width="30" value="<dtml-var ramal>"></TD>
</TR>
<TR>
<TH>Radio</TH>
<TD><INPUT name=Radio width="30" value="<dtml-var radio>"></TD>
</TR>
<TR>
<TH>Celular</TH>
<TD><INPUT name=Celular width="30" value="<dtml-var celular>"></TD>
</TR>
<TR>
<TH>Email</TH>
<TD><INPUT name=Email width="50" value="<dtml-var email>"></TD>
</TR>
<TR>
<TH></TH>
<TD><input TYPE="hidden" VALUE="<dtml-var Cod>" NAME=cod></TD>
</TR>
<TR>
<TH></TH>
<TD><INPUT type=submit value="Atualizar" name="q_altera_ramal:method"></TD>
</TR>
<TR>
<TH></TH>
<TD><INPUT type=submit value="Excluir" name="q_exclui_ramal:method"></TD>
</TR>
</TBODY>
</TABLE>
</FORM>  

Crie um zsqlmethod com o id de sql_altera_ramais com os arguments:

cod
Usuario
Unidade
Ramal
Radio
Celular
Email
query = update ramais set usuario="<dtml-var Usuario>", unidade="<dtml-var Unidade>", ramal="<dtml-var Ramal>", radio="<dtml-var Radio>", celular="<dtml-var Celular>", email="<dtml-var Email>" where cod=<dtml-var cod>

Crie outro zsqlmethod com o id sql_exclui_ramais com o arguments de cod e com a query template de:

delete from ramais where cod = "<dtml-var cod>"

Quando o usuário clicar em excluir, o Zope vai chamar a página dtml q_exclui_ramal que tem o seguinte código:

 
<h2>Registo Excluído com Sucesso!</h2>

<dtml-call sql_exclui_ramais>

<br>

<FORM action=http://localhost method=get>

<INPUT type=submit value="OK" name=SUBMIT>

</FORM>  

e quando clicar em atualizar ele vai chamar a página dtml q_altera_ramal que tem o seguinte código:

 
<h2>Informações Atualizadas com sucesso</h2>

<dtml-call sql_altera_ramais>

<br>

<FORM action=http://webcoop method=get>

<INPUT type=submit value="OK" name=SUBMIT>

</FORM>  

Como vocês viram, se cria um dtml method com o formulário que chama um segundo dtml method que chama a zsql method para a realização da query SQL.

É um pouco confuso no início, mas fica fácil lembrar assim:
dtml method - formulário
zsql method - instruções sql
dtml method - pagina a ser chamada pelo formulário com a chamada para a zsql method em questão.

Simples!

Conclusão

Neste artigo aprendemos como realizar as quatro operações básicas no Zope: inserir, consultar, deletar e atualizar.

Esse assunto pode ser muito mais estendido, acessando o site http://www.zope.org e http://www.zopelabs.com vocês poderão achar outros exemplos.

Espero ter ajudado!

Até o próximo,
Fabio Rizzo
fabiorizzo@gmail.com
www.fabiorizzo.tk

Fábio Rizzo Matos

Fábio Rizzo Matos - Membro ativo da Comunidade Python/Zope e Plone, para qual escreve diversos artigos. Arquiteto de Software e Desenvolvedor, trabalha atualmente na ThreePointsWeb (contato@threepointsweb.com), empresa especializada em desenvolvimento e treinamentos Python, Zope e Plone, realizando treinamentos e consultorias em Plone. Mantenedor do site http://www.fabiorizzo.com além de responsável pela tradução de conteúdo.