![]() |
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.soSe o seu programa for rodar em ambiente UNIX, e:
load libpgtcl.dllSe 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/cdromCaso a sua distribuição seja o CL 5.0, mude para o diretório /mnt/cdrom/conectiva/RPMS:
# cd /mnt/cdrom/conectiva/RPMSInstale os RPMS:
# rpm -ivh postgresql-*.rpmIsso instalará diversos pacotes, incluindo os drivers ODBC e JDBC, interfaces gráficas, documentação etc.
Desmonte o CD-ROM:
# cd ~/
# umount /mnt/cdromAgora, 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 trustIsso 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 startAgora 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árioTroque 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_dadosTroque 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:
|
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 |
|
code
|
name |
|
1
|
Pizza Média |
|
2
|
Pizza Grande |
|
3
|
Pizza Família |
|
4
|
Lazanha |
|
5
|
Filé |
|
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 $conO fragmento de código acima imprimirá no console a tabela abaixo:
| 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 |
Copyright(C) 2000 by Roberto Luiz Souza Monteiro