Tcl/Tk
Curso On-Line de Programação

Acessando um banco de dados PostgreSQL

A interface PostgreSQL-Tcl oferece diversos comandos que permitem o acesso aos bancos de dados do PostgreSQL através da linguagem SQL. O PostgreSQL suporta um superset do SQL92, oferecendo comandos e tipos de dados adicionais.

Para acrescentar o suporte aos bancos de dados do PostgreSQL em seus programas, você deve incluir o comando a seguir, logo no início de seu programa:

load libpgtcl.so
Se o seu programa for rodar em ambiente UNIX, e:
load libpgtcl.dll
Se o seu programa for rodar no Windows.

Observe que para rodar um programa em Tcl ou qualquer outra linguagem no Windows, você precisará ter um servidor UNIX ou Windows NT rodando o RDBMS do PostgreSQL e aceitando conecções via TCP/IP, pois o PostgreSQL não pode rodar no Windows95/98.

Uma outra alternativa é utilizar um interpretador Tcl com o suporte ao PostgreSQL embutido. O pacote do PostgreSQL inclui os interpretadores pgtclsh e pgtksh, que permitem executar programas em Tcl para o console e para o X-Window respectivamente.

Neste ponto, você deve instalar e configurar o seu PostgreSQL para que possa prosseguir neste estudo. A seguir estão todas as instruções necessárias para preparar o seu servidor de banco de dados PostgreSQL.
 

Instalando o PostgreSQL

Para instalar o PostgreSQL em um sistema compatível com RPMs, coloque o CD-ROM da sua distribuição do Linux em seu drive de CDs e monte-o seguindo os passos abaixo. Mas lembre-se: você precisa ser o usuário root.

# mount /mnt/cdrom
Caso a sua distribuição seja o CL 5.0, mude para o diretório /mnt/cdrom/conectiva/RPMS:
# cd /mnt/cdrom/conectiva/RPMS
Instale os RPMS:
# rpm -ivh postgresql-*.rpm
Isso instalará diversos pacotes, incluindo os drivers ODBC e JDBC, interfaces gráficas, documentação etc.

Desmonte o CD-ROM:

# cd ~/
# umount /mnt/cdrom
Agora, usando o seu editor preferido modifique o arquivo /etc/rc.d/init.d/postgresql. Você deve procurar a linha abaixo:
daemon --check postmaster su -l postgres -c \"/usr/bin/postmaster -S -D/var/lib/pgsql\"
E modificá-la para:
daemon --check postmaster su -l postgres -c \"/usr/bin/postmaster -S -i -D/var/lib/pgsql\"
Acrescentando a opção -i que instrui o servidor postmaster a aceitar conecções via TCP/IP.

Agora edite o arquivo /var/lib/pgsql/pg_hba.conf, como o usuário postgres( não faça isso como root ), e remova o comentário da linha:

host    all    0.0.0.0    0.0.0.0    trust
Isso dará permissão de acesso a qualquer usuário, de qualquer máquina para acessar qualquer banco de dados no servidor PostgreSQL.

Se você desejar, pode implementar qualquer outra forma de restrição de acesso, utilizando os modelos que se encontram comentados no arquivo. Por hora, deixe assim, para que outras máquinas da rede possam acessar seus bancos de dados PostgreSQL.

Inicialize o servidor postmaster:

# /etc/rc.d/init.d/postgresql start
Agora faça com que o servidor seja inicializado, sempre que o Linux for iniciado. Para isso execute o programa /usr/sbin/ntsysv, faça uma marca no serviço postgresql e confirme.

Pronto! O seu servidor está configurado para servir bancos de dados PostgreSQL.
 

Criando um usuário

Para acessar um banco de dados PostgreSQL você deve ser um usuário cadastrado na base de dados do PostgreSQL. Para tanto, como o usuário postgres, digite:

$ createuser nome_de_usuário
Troque nome_de_usuário pelo nome do usuário que você quer criar. Se quiser simplificar as coisas, pode usar o usuário postgres por enquanto. Confirme todas as perguntas que o programa createuser fizer, desta vez.

Você também pode criar um usuário usando a interface SQL, através do comando:

CREATE USER nome_do_usuário;


Criando um banco de dados

Para criar um banco de dados você deve ser um usuário cadastrado na base de dados do PostgreSQL. Para tanto digite:

$ createdb nome_do_banco_de_dados
Troque nome_do_banco_de_dados pelo nome do banco de dados que você deseja crair.

Você também pode criar um banco de dados usando a interface SQL, através do comando:

CREATE DATABASE nome_do_banco_de_dados;


A interface PostgreSQL-Tcl

Os principais comandos oferecidos pela interface PostgreSQL-Tcl são os seguintes:
 

Comando Descrição
pg_connect nome_do_banco_de_dados [-host servidor] [-port porta] [-optionsopções] Abre uma conecção com o banco de dados. Retorna um handle para a conecção.
pg_disconnect conecção Fecha a conecção com o banco de dados. Conecção é o handle para a conecção.
pg_exec conecçãoconsulta_sql Executa uma consulta SQL. Retorna um handle para o resultado da cunsulta. Conecção é o handle para a conecção.
pg_select conecçãoconsulta_sqlvariávelscript Executa um laço através do resultado de um SELECT, atribuindo ao vetor associativo variável, o conteúdo de cada linha retornada na consulta e executando o script a cada interação. Conecção é o handle para a conecção.
pg_result resultadoopções Retorna diversos resultados relacionados com a consulta SQL. Veja as opções na tabela abaixo. Resultado é o handle para o resultado da consulta.

O comando pg_result suporta as seguintes opções:
 

Opção Descrição
-status Retorna o status da consulta. Verifique sempre.
-error Retorna o erro ocorrido, caso tenha ocorrido um erro. Verifique sempre.
-conn Retorna a conecção que gerou a consulta.
-oid Retorna o OID caso tenha sido efetuado um INSERT, caso contrário, retorna uma string vazia.
-numTuples Retorna o número de linhas retornadas.
-numAttrs Retorna o número de colunas retornadas.
-assign variável Atribui o resultado da consulta ao vetor associativo bidimensional variável. Onde cada elemento do vetor possui um índice da seguinte forma: variável(número_da_linha, nome_da_coluna).
-assignbyidx variável ?string? Atribui o resultado da consulta a um vetor, usando o valor do primeiro atributo e os nomes dos demais atributos como as chaves. Se a string for dada ela será anexada a cada chave: variável(valor_do_primeiro_campo,nome_do_campostring).
-getTuple número Retorna a linha indicada por número, na forma de uma lista, onde cada elemento da lista corresponde a uma coluna.
-tupleArray númerovariável Retorna a linha indicada por número no vetor associativo variável, onde cada elemento do vetor corresponde a uma coluna e é identificado pelo nome da coluna: variável(nome_da_coluna).
-attributes Retorna os nomes das colunas retornadas na consulta.
-lAttributes Retorna os nomes das colunas retornadas na consulta e as suas propriedades: {{nome tipo tamanho}...}.
-clear Limpa o objeto da consulta. Execute sempre que terminar de usar o objeto, ou ficará sem espaço para trabalhar com o banco de dados e um erro fatal ocorrerá.

Exemplos

Considere as seguintes tabelas:
 

districts
code
name
1
Arenoso
2
Arvoredo
3
Av. Bete
4
Amaralina
5
Aeroporto
6
Barros Reis
7
Barbalho
8
Bonocô
9
Brotas
10
Boca do Rio

 
products
code
name
1
Pizza Média
2
Pizza Grande
3
Pizza Família
4
Lazanha
5
Filé

 
prices
district
product
value
1
1
12.00
1
2
13.90
1
3
17.00
1
4
13.90
1
5
13.90
2
1
12.00
2
2
13.90
2
3
17.00
2
4
13.90
2
5
13.90

Abra o interpretador Tcl e digite os comandos a seguir( ou copie e cole se estiver no windows ou usando o kfm e o KTk no KDE ):

load libpgtcl.so
set con [pg_connect pizza]
set res [pg_resul $con 'SELECT t1.name as district,t2.name as product,t3.value
FROM districts as t1, products as t2, prices as t3
WHERE t3.district = t1.code AND t3.product = t2.code
ORDER BY t1.name;' ]
puts "[format {%-30s} district][format {%-30s} product][format {%10s} value]\n\n"
for {set i 0} {$i < [pg_result $res -numTuples]} {incr i} {
    pg_result $res -tupleArray $i tuple
    puts "[format {%-30s} $tuple(district)][format {%-30s} $tuple(product)][format {%10s} $tuple(value)]\n"
}
pg_result $res -clear
pg_disconnect $con
O fragmento de código acima imprimirá no console a tabela abaixo:
 
RESULTADO DA CONSULTA
district product price
Arenoso Pizza Média
12.00
Arenoso Pizza Grande
13.90
Arenoso
Pizza Família
17.00
Arenoso Lazanha
13.90
Arenoso Filé
13.90
Arvoredo Pizza Média
12.00
Arvoredo Pizza Grande
13.90
Arvoredo Pizza Família
17.00
Arvoredo Lazanha
13.90
Arvoredo Filé
13.90

Para facilitar o trabalho com bancos de dados do PostgreSQL em Tcl/Tk eu criei uma biblioteca chamada TDO( Tcl Database Access Objects ), que permite o acesso às tabelas de modo muito parecido com o MS-DAO, usado no Visual Basic. Você pode ler um pouco mais sobre a biblioteca TDO e fazer o download dos arquivos através do meu site: http://www.souzamonteiro.com/download_freeware.shtml.

Você também pode estudar o código fonte do meu programa Cadastro de Clientes e Fornecedores para Linux - TkCustomer. Faça o download dos arquivos através do meu site: http://www.souzamonteiro.com/download_freeware.shtml.

Para uma descrição detalhada de todos os comandos disponíveis em uma interface Tcl-RDBMS, consulte a documentação on-line do seu RDBMS. Para uma aula introdutória à linguagem SQL consulte a apostila Programando em SQL disponível para download em http://www.souzamonteiro.com/download_freeware.shtml.

Para maiores informações envie e-mail para info@souzamonteiro.com.


http://www.souzamonteiro.com
info@souzamonteiro.com

Copyright(C) 2000 by Roberto Luiz Souza Monteiro