PostgreSQL Manipulando o Banco de Dados Aula 03 Aula 03 Acessando um banco de dados Apó Após o banco de dados ter sido criado, pode ser acessado pela: 1) Execuç Execução do programa de terminal interativo do PostgreSQL chamado psql, que permite a entrada, ediç edição e execuç execução de comandos SQL interativos. 2) Utilizaç Utilização de uma ferramenta cliente grá gráfica existente como o PgAdmin, PgAdmin, ou de um pacote de automaç automação de escritó escritórios com suporte a ODBC para criar e manusear bancos de dados. 3) Criaç Criação de aplicaç aplicações personalizadas, usando uma das vá várias ligaç ligações com linguagens disponí disponíveis, como por exemplo o PHP. Antes de usarmos o terminal interativo PSQL, vamos ter que criar uma nova base de dados, utilizando o comando createdb no sistema operacional, ou usar o comando create database de dentro do psql. createdb –U postgres –h 127.0.0.1 nomebancodedados 1 Aula 03 Utilizando o PSQL O psql é um cliente no modo terminal do PostgreSQL. Permite digitar comandos interativamente, submetêsubmetê-los para o PostgreSQL e ver os resultados. Como alternativa, a entrada pode vir de um arquivo. Alé Além disso, possui vá vários metameta-comandos e diversas funcionalidades semelhantes às da shell para facilitar a criaç criação de scripts e automatizar um grande nú número de tarefas. Aula 03 Terminal Interativo – PSQL - Opç Opções -a ou --echo --echo--all Exibe todas as linhas na tela ao serem lidas. É mais útil para o processamento de scripts que no modo interativo. Equivale a definir a variá variável ECHO como all. all. -A ou --no --no--align Muda para o modo de saí saída não alinhado (De outra forma, o modo de saí saída padrão é o alinhado). -c comando ou --command --command comando Especifica que o psql deve executar a cadeia de caracteres comando comando e, em seguida, terminar. Útil em scripts. O comando deve ser uma cadeia de caracteres que possa ser integralmente analisada pelo servidor (ou seja, não conté contém funcionalidades especí específicas do psql), ou ser um único comando de contrabarra. contrabarra. Portanto, não podem ser misturados comandos SQL com metameta-comandos do psql. Para misturar, a cadeia de caracteres pode ser enviada para o psql conforme conforme mostrado a seguir: echo "\x \\ select * from foo;" foo;" | psql. Se a cadeia de caracteres do comando conté contém vá vários comandos SQL, estes são processados em uma única transaç transação, a menos que existam comandos BEGIN/COMMIT explí explícitos incluí incluídos na cadeia de caracteres para divididividi-la em várias transaç transações. Este comportamento é diferente do comportamento ocorrido quando a mesma cadeia de caracteres é recebida pela entrada padrão do psql. 2 Aula 03 Terminal Interativo – PSQL - Opç Opções -d nome_bd ou --dbname --dbname nome_bd Especifica o nome do banco de dados a se conectar. Equivale a especificar especificar nome_bd como o primeiro argumento nãonão-opç opção na linha de comando. -e ou --echo --echo--queries Mostra todos os comandos enviados para o servidor. Equivale a definir definir a variá variável ECHO como queries. queries. -E ou --echo --echo--hidden Exibe o comando verdadeiro gerado por \d e por outros comandos de contrabarra. contrabarra. Pode ser usado caso se deseje incluir uma funcionalidade semelhante nos pr próprios programas. Equivale a definir a variá variável ECHO_HIDDEN a partir do psql. -f nome_do_arquivo ou --file --file nome_do_arquivo Usa o arquivo nome_do_arquivo como origem dos comandos, em vez de ler os comandos interativamente. Apó Após o arquivo ser processado, o psql termina. Sob muitos aspectos equivale ao comando interno \i. Se o nome_do_arquivo for - (hí (hífen) a entrada padrão é lida. O uso desta opç opção é quase imperceptivelmente diferente de escrever psql < nome_do_arquivo. nome_do_arquivo. De uma maneira geral, as duas formas fazem o esperado, mas o uso uso de -f ativa algumas funcionalidades úteis, como mensagens de erro com o nú número da linha. Ao se usar esta opç opção existe, també também, uma pequenachance de reduzir o trabalho extra de inicializaç inicialização. ão. Por outro lado, a utilizaç utilização do redirecionamento da entrada (em teoria) garante produzir exatamente a mesma saí saída produzida quando tudo é digitado manualmente. Aula 03 Terminal Interativo – PSQL - Opç Opções -F separador ou --field --field--separator separador Usa separador como o separador de campos. Equivale a \pset fieldsep ou ao comando \f. -h hospedeiro ou --host --host hospedeiro Especifica o nome de hospedeiro da má máquina onde o servidor está está executando. Se o nome iniciar por uma barra (/) é usado como o diretó diretório do soquete do domí domínio Unix. -H ou --html --html Ativa a saí saída tabular HTML. Equivale a \pset format html ou ao comando \H. -l ou --list --list Mostra todos os bancos de dados disponí disponíveis e depois termina. Outras opç opções que não sejam de conexão são ignoradas. Semelhante ao comando interno \list. list. -o nome_do_arquivo ou --output --output nome_do_arquivo Envia a saí saída de todos os comandos para o arquivo nome_do_arquivo. nome_do_arquivo. Equivale ao comando \o. -p porta ou --port porta Especifica a porta TCP, ou a extensão de arquivo do soquete do domínio Unix local, onde o servidor está ouvindo as conexões. Por padrão o valor da variável de ambiente PGPORT ou, se não estiver definida, a porta especificada durante a compilação, geralmente 5432. 3 Aula 03 Terminal Interativo – PSQL - Opç Opções -P atribuiç atribuição ou --pset --pset atribuiç atribuição Permite especificar opç opções de exibiç exibição no estilo \pset pela linha de comando. Observe que aqui o nome e o valor devem estar separados pelo sinal de igual, em vez de espaç espaço. Portanto, para definir o formato de saí saída como LaTeX deve ser escrito -P format= format=latex. latex. -q ou --quiet --quiet Especifica que o psql deve trabalhar em silêncio. Por padrão, são são exibidas mensagens de boasboas-vindas e vá várias outras mensagens informativas. Se esta opç opção for usada, nada disso acontece. É útil em conjunto com a opç opção -c. Dentro do psql é possí possível, també também, definir a variá variável QUIET para produzir o mesmo efeito. -R separador ou --record --record--separator separador Usa separador como o separador de registros. Equivale ao comando \pset recordsep. recordsep. -s ou --single --single--step Executa no modo passopasso-único, significando que será será solicitada uma confirmaç confirmação antes de cada comando ser enviado para o servidor, com a opç opção de cancelar a execuç execução. Usado para depurar scripts. -S ou --single --single--line Executa no modo linhalinha-única, onde o caractere de novanova-linha termina o comando SQL, como o pontoponto-e-vírgula faz. Aula 03 Terminal Interativo – PSQL - Opç Opções -t ou --tuples --tuples--only Desativa a exibiç exibição dos nomes das colunas, do rodapé rodapé com o nú número de linhas do resultado, etc. É inteiramente equivalente ao metameta-comando \t. -T opç opções_de_tabela ou --table --table--attr opç opções_de_tabela Permite especificar opç opções a serem colocadas dentro da marca table do HTML. Veja \pset para obter detalhes. -u Faz o psql solicitar o nome do usuá usuário e a senha antes de conectar ao banco de dados. Esta opç opção está está obsoleta, porque é conceitualmente incorreto (Solicitar um nome de usuá usuário não padrão e solicitar uma senha porque o servidor requer são realmente realmente duas coisas diferentes). EncorajaEncoraja-se o uso das opç opções -U e -W em seu lugar. -U nome_do_usuá nome_do_usuário ou --username --username nome_do_usuá nome_do_usuário Conecta ao banco de dados como o usuá usuário nome_do_usuá nome_do_usuário em vez do padrão (É (É necessá necessário ter permissão para fazêfazê-lo, é claro). -v atribuiç atribuição ou --set --set atribuiç atribuição ou --variable --variable atribuiç atribuição Realiza atribuiç atribuição de variá variável, como o comando interno \set. Observe que é necessá necessário separar o nome e o valor, se houver, por um sinal de igual na linha linha de comando. Para remover a definiç definição de uma variá variável omiteomite-se o sinal de igual. Para definir uma variá variável sem um valor, usausa-se o sinal de igual mas omiteomite-se o valor. 4 Aula 03 Terminal Interativo – PSQL - Opç Opções -V ou --version --version Mostra a versão do psql. -W ou --password --password Requer que o psql solicite a senha antes de conectar ao banco de dados. Esta continuará continuará definida por toda a sessão, mesmo que a conexão ao banco de dados dados seja mudada com o metameta-comando \connect. connect. Na versão corrente, o psql automaticamente solicita a senha sempre que o servidor requer autenticaç autenticação por senha. Como atualmente isto se baseia em um hack, hack, o reconhecimento automá automático pode falhar misteriosamente e, por isso, existe esta opç opção para forç forçar a solicitaç solicitação. Se a solicitaç solicitação da senha não for feita, e o servidor requer autenticaç autenticação por senha, a tentativa de conexão não será será bembem-sucedida. -x ou --expanded --expanded Ariva o modo formataç formatação de tabela estendido Equivale ao comando \x. -X ou --no --no--psqlrc Não lê o arquivo de inicializaç inicialização ~/.psqlrc ~/.psqlrc.. -? ou --help --help Mostra a ajuda sobre os argumentos de linha de comando do psql. Status de saí saída Aula 03 Terminal Interativo – PSQL - Opç Opções O psql retorna: 0 se terminar normalmente; 1 se ocorrer erro fatal fatal pró próprio (falta de memó memória, arquivo não encontrado); 2 se a conexão com o servidor teve problema e a sessão não é interativa; 3 se ocorrer erro no script e a variá variável ON_ERROR_STOP estiver definida. O psql é uma aplicaç aplicação cliente do PostgreSQL comum. Para conectar a um banco de dados dados é necessá necessário saber o nome do banco de dados, o nome do hospedeiro, o nú número da porta do servidor e o nome do usuá usuário a ser usado para conectar. O psql pode ser informado sobre estes parâmetros por meio das opç opções de linha de comando -d, -h, -p e -U, respectivamente. Se for encontrado um argumento que não pertenç pertença a nenhuma opç opção, este será será interpretado como o nome do banco de dados (ou o nome do usuá usuário, se o nome do banco de dados já já tiver sido fornecido). Nem todas estas opç opções são necessá necessárias, os padrões se aplicam. Se for omitido o nome do hospedeiro, então o psql se conecta atravé através do soquete do domí domínio Unix ao servidor no hospedeiro local. O nú número padrão para a porta é determinado na compilaç compilação. Uma vez que o servidor de banco de dados usa o mesmo padrão, não é necessá necessário especificar a porta na maioria dos casos. O nome de usuá usuário padrão é o nome do usuá usuário do Unix, como també também é o nome do banco de dados padrão. Observe que não é possí possível se conectar a qualquer banco de dados com qualquer nome de usuá usuário. O administrador de banco de dados deve informar as permissões permissões de acesso concedidas. Para evitar a digitaç digitação, podem ser definidas as variá variáveis de ambiente PGDATABASE, PGHOST, PGPORT e PGUSER com os valores apropriados. 5 Aula 03 Terminal Interativo – PSQL - Opç Opções Se a conexão não puder ser estabelecida por algum motivo (por exemplo, exemplo, privilé privilégios insuficientes, o servidor não está está executando no hospedeiro, etc.), o psql retorna uma mensagem de erro e termina. Entrando com comandos SQL No modo normal de operaç operação, o psql exibe um prompt com o nome do banco de dados ao qual está está conectado, seguido pela cadeia de caracteres =>. Por exemplo: $ psql testedb Welcome to psql 7.4.5, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit testedb=> testedb=> No prompt o usuá usuário pode digitar comandos SQL. Normalmente, as linhas de entrada são enviadas para o servidor quando o caractere pontoponto-e-vírgula, que termina o comando, é encontrado. Um caractere de fimfim-dede-linha não termina o comando. Portanto, os comandos podem ser distribuí distribuídos por vá várias linhas para clareza. Se o comando for enviado e executado sem erro, o resultado do comando será será exibido na tela. Aula 03 Terminal Interativo – PSQL - Opç Opções MetaMeta-comandos Qualquer texto digitado no psql começ começando por uma contrabarra (\) (não entre apó apóstrofos, ') é um metameta-comando do psql processado pelo pró próprio psql. Estes comandos tornam o psql interessante para administraç administração e para scripts. Os metameta-comandos são geralmente chamados de comandos de barra ou de contrabarra. contrabarra. O formato de um comando psql é a contrabarra, contrabarra, seguida imediatamente por um verbo comando, e depois pelos argumentos. Os argumentos são separados do verbo comando, e entre si, por qualquer nú número de caracteres de espaç espaço. Para incluir caracteres de espaç espaço no argumento devedeve-se colocá colocá-los entre apó apóstrofos ('). Para incluir um apó apóstrofo neste tipo de argumento, devedeve-se precedêprecedê-lo por uma contrabarra. contrabarra. Qualquer texto entre apó apóstrofos está está sujeito às substituiç substituições no estilo C para \n (nova(novainha), inha), \t (tabulaç (tabulação), \dígitos, \0dí 0dígitos e \0xdí 0xdígitos (o caractere com o có código decimal, octal ou hexadecimal especificado). Se um argumento (não entre apó apóstrofos) começ começar por doisdois-pontos (:), será será considerado como sendo uma variá variável e o valor desta variá variável será será usado como o argumento. 6 Aula 03 Terminal Interativo – PSQL – Meta dados Os seguintes metameta-comandos estão definidos: \a Se o formato atual de saí saída da tabela for não alinhado, muda para alinhado. Se não for não não alinhado, define como não alinhado. Este comando é mantido para compatibilidade com as versões anteriores. Veja \pset para uma soluç solução geral. \cd [diretó [diretório] Muda o diretó diretório de trabalho corrente para diretó diretório. Sem argumento, muda para o diretó diretório home do usuá usuário corrente. Dica: Para ver o diretó diretório de trabalho corrente deve ser usado \!pwd. pwd. \C [ tí título ] Define o tí título de qualquer tabela mostrada como resultado de uma consulta, ou remove a definiç definição deste tí título. Este comando equivale a \pset titletí titletítulo (O nome deste comando deriva de "caption "caption"" (tí (título), porque anteriormente só só era usado para definir tí título em tabela no HTML). Aula 03 Terminal Interativo – PSQL – Meta dados \connect (ou \c) [ nome_bd [ nome_do_usuá nome_do_usuário ] ] Estabelece a conexão com um banco de dados novo e/ou sob um usuá usuário novo. A conexão anterior é fechada. Se nome_bd for - (hí (hífen), então é utilizado o nome do banco de dados corrente. Se o nome_do_usuá nome_do_usuário for omitido, então o nome do usuá usuário corrente é utilizado. Como regra especial, \connect sem nenhum argumento conecta ao banco de dados padrão com o usuá usuário padrão (da mesma forma que aconteceria se o psql fosse executado executado sem argumentos). Se a tentativa de conexão não for bembem-sucedida (nome de usuá usuário errado, acesso negado, etc.), a conexão anterior será será mantida se, e somente se, o psql estiver no modo interativo. Ao executar um script não interativo, o processamento processamento será será imediatamente interrompido com erro. Esta distinç distinção foi escolhida por ser mais conveniente para o usuá usuário que digita menos, e como um mecanismo de seguranç segurança impedindo os scripts atuarem acidentalmente no banco de dados errado. \copy tabela [ ( lista_de_colunas ) ] { from | to } nome_do_arquivo | stdin | stdout [ with ] [ oids ] [ delimiter [as] 'caractere' ] [ null [as] 'cadeia_de_caracteres 'cadeia_de_caracteres'' ] Executa uma có cópia pelo cliente. Esta é uma operaç operação que executa o comando SQL COPY, mas em vez do servidor ler ou escrever no arquivo especificado, o psql lê ou escreve no arquivo e roteia os dados entre o servidor e o sistema de arquivos local. Isto significa significa que a acessibilidade ao arquivo e os privilé privilégios são do usuá usuário local, e não do servidor, e que não há necessidade dos privilé privilégios do superusuá superusuário. rio. A sintaxe deste comando é semelhante à sintaxe do comando SQL COPY. Observe que, por isso, regras especiais especiais de aná análise se aplicam ao comando \copy. copy. Em particular, as regras de substituiç substituição de variá variável e de escapes de contrabarra (\) não se aplicam. 7 Aula 03 Terminal Interativo – PSQL – Meta dados \copyright Mostra os termos da distribuiç distribuição e dos direitos autorais do PostgreSQL. \d [ padrão ] Para cada relaç relação (tabela, visão, índice ou seqü seqüência) correspondendo ao padrão, mostra todas as colunas, seus tipos e atributos especiais como NOT NULL ou o valor padrão, se houver. Os índices, restriç restrições, regras e gatilhos associados també também são mostrados, assim como a definiç definição da visão se a relaç relação for uma visão (A "Correspondência com padrão" é definida abaixo). A forma \d+ do comando é idêntica, mas todos os comentá comentários associados às colunas da tabela també também são mostrados. Nota: Se \d for utilizado sem o argumento padrão, tornatorna-se equivalente a \dtvs, dtvs, mostrando a lista de todas as tabelas, visões e seqü seqüências. Isto é puramente uma medida de conveniência. \da [ padrão ] Mostra todas as funç funções de agregaç agregação disponí disponíveis, junto com o tipo de dado com que operam. Se padrão for especificado, somente as agregaç agregações cujos nomes correspondem ao padrão são mostradas. \dc [ padrão ] Mostra todas as conversões entre codificaç codificações de conjunto de caracteres disponí disponíveis. Se padrão for especificado, somente as conversões cujos nomes correspondem correspondem ao padrão são mostradas. Aula 03 Terminal Interativo – PSQL – Meta dados \dC Mostra todas as conversões de tipo disponí disponíveis. \dd [ padrão ] Mostra a descriç descrição dos objetos cujos nomes correspondem ao padrão, ou todos os objetos objetos visí visíveis se nenhum argumento for especificado. Nos dois casos somente somente os objetos que possuem uma descriç descrição são mostrados ("Objeto" compreende agregaç agregações, funç funções, operadores, tipos, relaç relações [tabelas, visões, índices, seqü seqüências e objetos grandes], regras e gatilhos). Por exemplo: exemplo: => \dd version Object descriptions Schema | Name | Object | Description ------------+ ------------+---------+ ---------+----------+ ----------+--------------------------pg_catalog | version | function | PostgreSQL version string (1 linha) As descriç descrições dos objetos podem ser criadas pelo comando SQL COMMENT ON. \dD [ padrão ] Mostra todos os domí domínios disponí disponíveis. Se padrão for especificado, somente os domí domínios cujos nomes correspondem ao padrão são mostrados. 8 Aula 03 Terminal Interativo – PSQL – Meta dados \df [ padrão ] Mostra as funç funções disponí disponíveis, junto com o tipo de dado de seus argumentos e do valor retornado. Se padrão for especificado, somente as funç funções cujos nomes correspondem ao padrão são mostradas. Se a forma \df+ df+ for usada, informaç informações adicionais sobre cada funç função, incluindo a linguagem e a descriç descrição, são mostradas. Nota: Para diminuir a confusão, \df não mostra as funç funções com tipo de dado I/O. Isto é implementado ignorando as funç funções que recebem ou retornam o tipo cstring. cstring. \distvS [ padrão ] Este não é na verdade o nome do comando: As letras i, s, t, v, S correspondem correspondem a índice, seqü seqüência, tabela, visão e tabela do sistema, respectivamente. Pode ser especificada qualquer uma ou todas as letras, em qualquer ordem, para obter a relaç relação de todos os objetos correspondentes. A letra S restringe a listagem aos objetos objetos do sistema; sem o S, somente os objetos que não são do sistema são mostrados. Se o caractere caractere "+" for anexado ao nome do comando, cada objeto é mostrado junto com sua descriç descrição associada, se houver. Se o padrão for especificado, somente os objetos cujos nomes nomes correspondem ao padrão são mostrados. \dl Este é um outro nome para \lo_list, lo_list, que mostra a lista dos objetos grandes. Aula 03 Terminal Interativo – PSQL – Meta dados \dn [ padrão ] Mostra todos os esquemas (espaç (espaços de nomes) disponí disponíveis. Se padrão (uma expressão regular) for especificado, somente os esquemas cujos nomes correspondem correspondem ao padrão são mostrados. \do [ padrão ] Mostra os operadores disponí disponíveis junto com o tipo de seus operandos e do valor retornado. Se padrão for especificado, somente os operadores cujos nomes correspondem correspondem ao padrão são mostrados. \dp [ padrão ] Produz uma lista contendo todas as tabelas disponí disponíveis junto com seus privilé privilégios de acesso associados. Se padrão for especificado, somente as tabelas cujos nomes correspondem ao padrão são mostradas. Os comandos GRANT e REVOKE são utilizados para definir privilé privilégios de acesso. Veja o comando GRANT para obter mais informaç informações. \dT [ padrão ] Mostra todos os tipos de dado, ou somente aqueles que correspondem correspondem ao padrão. A forma \dT+ dT+ do comando mostra informaç informações adicionais. \du [ padrão ] Mostra todos os usuá usuários do banco de dados, ou somente aqueles que correspondem ao padrão. 9 Aula 03 Terminal Interativo – PSQL – Meta dados \edit (ou \e) [ nome_do_arquivo ] Se o nome_do_arquivo for especificado, o arquivo é editado; apó após o fim da execuç execução do editor, o conteú conteúdo do arquivo é copiado de volta para o buffer de comando. Se nenhum argumento for fornecido, o buffer de comando corrente é copiado para um arquivo temporá temporário, que é editado de forma idêntica. O novo buffer de comando é então analisado novamente de acordo com as regras normais do psql, onde o todo buffer buffer é tratado como sendo uma única linha (Portanto, não podem ser gerados scripts dessa forma. Use o comando \i para fazer isso). Isto significa també também que, se o comando terminar por (ou contiver) um pontoponto-e-vírgula, será será executado imediatamente. Se não contiver, apenas permanecerá permanecerá aguardando no buffer de comando. Dica: O psql procura nas variá variáveis de ambiente PSQL_EDITOR, EDITOR e VISUAL (nesta ordem) o editor a ser usado. Se nenhuma delas estiver definida, então /bin /vi é executado. /bin/vi \echo texto [ ... ] Envia os argumentos para a saí saída padrão, separados por um espaç espaço e seguido por um caractere de novanova-linha, o que pode ser útil para intercalar informaç informações na saí saída dos scripts. Por exemplo: => \echo `date` Tue Oct 26 21:40:57 CEST 1999 Se o primeiro argumento for -n (não entre apó apóstrofos) o caractere de novanova-linha final não é enviado. Dica: Se for usado o comando \o para redirecionar a saí saída do comando, talvez se deseje utilizar \qecho em vez deste comando. Aula 03 Terminal Interativo – PSQL – Meta dados \encoding [ codificaç codificação ] Define a codificaç codificação do conjunto de caracteres do cliente. Sem argumento, este comando comando mostra a codificaç codificação corrente. \f [ cadeia_de_caracteres ] Define o separador de campos para a saí saída de comando não alinhada. O padrão é a barra vertical (|). Veja també também em \pset uma forma gené genérica de definir opç opções de saí saída. \g [ { nome_do_arquivo | |comando |comando } ] Envia o buffer de entrada de comando corrente para o servidor e, opcionalmente, salva a saí saída em nome_do_arquivo, nome_do_arquivo, ou envia a saí saída para outro interpretador de comandos do Unix para executar o comando. Um \g puro e simples é virtualmente equivalente ao pontoponto-evírgula. Um \g com argumento é uma alternativa "de uma só só vez" para o comando \o. \help (ou \h) [ comando ] Fornece ajuda de sintaxe para o comando SQL especificado. Se o comando comando não for especificado, então o psql mostra todos os comandos para os quais quais a ajuda de sintaxe está está disponí disponível. Se comando for um asterisco ("*"), então é mostrada a ajuda de sintaxe para todos os comandos SQL. Nota: Para simplificar a digitaç digitação, os comandos compostos por vá várias palavras não necessitam estar entre apó apóstrofos. Portanto, pode ser digitado \help alter table. table. 10 Aula 03 Terminal Interativo – PSQL – Meta dados \H Ativa o formato HTML de saí saída da consulta. Se o formato HTML já já estiver habilitado, retorna ao formato de texto alinhado padrão. Este comando existe por compatibilidade e conveniência, mas veja em \pset a definiç definição de outras opç opções de saí saída. \i nome_do_arquivo Lê a entrada no arquivo nome_do_arquivo, nome_do_arquivo, e executa como se tivesse sido digitada pelo teclado. Nota: Se for desejado ver as linhas na tela ao serem lidas, deve ser definida a variá variável ECHO como all. all. \l (ou \list) list) Mostra o nome, dono e codificaç codificação do conjunto de caracteres de todos oa bancos de dados do servidor. Deve ser adicionado + ao nome do comando para ver, també também, todas as descriç descrições dos bancos de dados. \lo_export loid nome_do_arquivo Lê no banco de dados o objeto grande com OID igual a loid, loid, e escreve em nome_do_arquivo. nome_do_arquivo. Observe que isto é quase imperceptivelmente diferente da funç função do servidor lo_export, lo_export, que atua com a permissão do usuá usuário como o qual o servidor de banco de dados processa, e no sistema de arquivos do servidor. Dica: Use \lo_list para descobrir os OIDs dos objetos grandes. Aula 03 Terminal Interativo – PSQL – Meta dados \lo_import nome_do_arquivo [ comment ] Armazena o arquivo em um objeto grande do PostgreSQL. Opcionalmente, Opcionalmente, associa o comentá comentário fornecido junto com o objeto. Exemplo: foo=> foo=> \lo_import '/home '/home//peter/ peter/pictures/ pictures/photo. photo.xcf' xcf' 'uma fotografia minha' lo_import 152801 A resposta indica que o objeto grande recebeu o identificador de objeto 152801, que deve ser lembrado para acessar o objeto novamente. Por esta razão, recomenda recomenda--se associar sempre um comentá comentário inteligí inteligível a cada objeto. Estes podem ser vistos utilizando o comando \lo_list. lo_list. Observe que este comando é quase imperceptivelmente diferente da funç função lo_import do servidor, porque atua como o usuá usuário local no sistema de arquivos local, em vez do usuá usuário do servidor no sistema de arquivos do servidor. \lo_list Mostra a lista de todos os objetos grandes do PostgreSQL armazenados armazenados neste instante no banco de dados, junto com os comentá comentários fornecidos para os mesmos. \lo_unlink loid Remove do banco de dados o objeto grande com o OID igual a loid. loid. Dica: Use \lo_list para descobrir os OIDs dos objetos grandes. 11 Aula 03 Terminal Interativo – PSQL – Meta dados \o [ {nome_do_arquivo }] {nome_do_arquivo | |comando |comando} Salva os resultados dos pró próximos comandos no arquivo nome_do_arquivo, nome_do_arquivo, ou envia os pró próximos resultados para um outro interpretador de comandos do Unix para executar o comando. Se nenhum argumento for especificado, a saí saída do comando será será redefinida para a saí saída padrão. Os "resultados dos comandos" incluem todas as tabelas, tabelas, respostas dos comandos e notificaç notificações obtidas do servidor de banco de dados, assim como a saí saída dos vários comandos de contrabarra que consultam o banco de dados (como o \d), mas não as mensagens de erro. Dica: Para intercalar saí saída de texto entre os resultados dos comandos deve ser utilizado \qecho. qecho. \p Envia o buffer de comando corrente para a saí saída padrão. \pset parâmetro [ value ] Este comando define opç opções que afetam a saí saída das tabelas de resultado das consultas. O parâmetro indica qual opç opção será será definida. A semântica do valor depende do parâmetro. As opç opções ajustá ajustáveis de exibiç exibição são: format, format, border, border, etc... - Veja nos pró próximos slides Aula 03 Terminal Interativo – PSQL – Meta dados format Define o formato de saí saída como unaligned (não alinhado), aligned (alinhado), html ou latex. latex. Formas abreviadas únicas são permitidas (O que equivale a dizer que uma letra basta). basta). O modo "Unaligned "Unaligned"" escreve todos as colunas em uma linha, separadas pelo separador separador de campos ativo no momento. PretendePretende-se com isso poder criar uma saí saída que sirva de entrada para outro programa (separada por tabulaç tabulação, por ví vírgula, etc.). O modo "Aligned "Aligned““ é a saí saída de texto padrão, inteligí inteligível e agradavelmente formatada. Os modos "HTML" e "LaTeX" LaTeX" produzem tabelas feitas para serem incluí incluídas em documentos usando a linguagem de marcaç marcação correspondente. Não são documentos completos! (Isto não é tão problemá problemático no HTML, mas no LaTeX deve haver um invó invólucro completo do documento). border O segundo argumento deve ser um nú número. Em geral, quanto maior o nú número mais bordas e linhas a tabela terá terá, mas isto depende do formato. No modo HTML será será traduzido diretamente para o atributo border=..., border=..., nos outros modos somente os valores 0 (sem borda), 1 (linhas divisó divisórias internas) e 2 (moldura da tabela) fazem sentido. expanded (ou x) Alterna entre os formatos regular e expandido. Quando o formato expandido está está ativo, todas as saí saídas possuem duas colunas, com o nome da coluna à esquerda e o dado à direita. Este modo é útil quando os dados não cabem na tela no modo normal "horizontal". "horizontal". O modo expandido é suportado por todos os quatro modos de saí saída. 12 Aula 03 Terminal Interativo – PSQL – Meta dados null O segundo argumento é a cadeia de caracteres a ser mostrada sempre que o campo for nulo. O padrão é não mostrar nada, que pode ser facilmente confundido com, por exemplo, exemplo, uma cadeia de caracteres vazia. Portanto, pode ser preferido escrever escrever \pset null '(nulo)'. fieldsep Especifica o separador de campos a ser utilizado no modo de saí saída não alinhado. Desta forma pode ser criada, por exemplo, uma saí saída separada por tabulaç tabulação, por ví vírgula ou por um outro caractere, conforme o programa preferir. Para definir o caractere de tabulaç tabulação como separador de campo deve ser usado \pset fieldsep '\t'. O separador de campos padrão é o '|' (a barra vertical). footer Alterna a exibiç exibição do rodapé rodapé padrão (x linhas). recordsep Especifica o separador de registro (linha) a ser usado no modo de de saí saída não alinhado. O padrão é o caractere de novanova-linha. Aula 03 Terminal Interativo – PSQL – Meta dados tuples_only (ou t) Alterna entre mostrar somente as tuplas e mostrar tudo. O modo mostrar tudo pode mostrar informaç informações adicionais como os cabeç cabeçalhos das colunas, tí títulos e vá vários rodapé rodapés. No modo tuplastuplas-apenas somente os dados da tabela são mostrados. title [ texto ] Define o tí título para as pró próximas tabelas mostradas. Pode ser usado para colocar textos descritivos na saí saída. Se nenhum argumento for fornecido, o tí título é removido. tableattr (ou T) [ texto ] Permite especificar qualquer atributo a ser colocado dentro da marca marca table do HTML. Estes atributos podem ser, por exemplo, cellpadding ou bgcolor. bgcolor. Observe que, provavelmente, não será será desejado especificar border aqui, porque isto já já é tratado pelo \pset border. border. pager Controla o uso do paginador para comandos e para a saí saída da ajuda do psql. Se a variá variável de ambiente PAGER estiver definida, a saí saída é enviada para o programa especificado, senão o padrão dependente da plataforma é utilizado (como o more). Quando o paginador está está inativo, a paginaç paginação não é feita. Quando o paginador está está ativo, a paginaç paginação é feita somente quando for apropriado, ou seja, a saí saída é para um terminal e não cabe na tela. O (psql não realiza um trabalho perfeito ao avaliar quando o paginador paginador deve ser utilizado). \pset pager ativa e desativa o paginador. O paginador també também pode ser definido como always, always, o que faz o paginador ser sempre utilizado. 13 Aula 03 Terminal Interativo – PSQL – Meta dados Existem vá vários comandos abreviados para o \pset. pset. Veja \a, \C, \H, \t, \T e \x. Nota: É errado chamar o \pset sem argumentos. No futuro, esta chamada deverá deverá mostrar o status corrente de todas as opç opções de exibiç exibição. \q Sair da aplicaç aplicação psql. \qecho texto [ ... ] Este comando é idêntico a \echo, echo, exceto que toda a saí saída é enviada para o canal de saí saída de comando, definido por \o. \r Restaura (limpa) o buffer de comando. \s [ nome_do_arquivo ] Mostra ou salva o histó histórico da linha de comando em nome_do_arquivo. nome_do_arquivo. Se nome_do_arquivo for omitido, o histó histórico é enviado para a saí saída padrão. Esta opç opção somente estará estará disponí disponível se o psql estiver configurado para usar a biblioteca de histó histórico GNU. Nota: Na versão corrente não é mais necessá necessário salvar o histó histórico dos comandos, porque isso é feito automaticamente quando o programa termina. O histó histórico també também é carregado, automaticamente, toda vez que o psql inicia. Aula 03 Terminal Interativo – PSQL – Meta dados \set [ nome [ value [ ... ]]] Define a variá variável interna nome com o valor ou, se mais de um valor for fornecido, fornecido, com a concatenaç concatenação de todos os valores. Se o segundo argumento não for fornecido, fornecido, a variá variável é definida sem valor. Para remover a definiç definição da variá variável deve ser usado o comando \unset. unset. Nomes de variá variáveis vá válidos podem conter letras, dí dígitos e sublinhados (_). Veja a seç seção Variá Variáveis abaixo para obter detalhes. Embora possa ser definida qualquer qualquer variá variável como qualquer coisa desejada, o psql trata vá várias variá variáveis como sendo especiais. Elas estão documentadas na seç seção sobre variá variáveis. Nota: Este comando é totalmente distinto do comando SQL SET. \t Alterna a exibiç exibição do cabeç cabeçalho contendo o nome das colunas e do rodapé rodapé contendo o número de linhas. Este comando equivale a \pset tuples_only, tuples_only, sendo fornecido por conveniência. \T opç opções_de_tabela Permite especificar atributos a serem colocados na marca table no modo de saí saída tabular HTML. Este comando equivale a \pset tableattr opç opções_de_tabela. ões_de_tabela. \timing Alterna a exibiç exibição de quanto tempo cada comando SQL leva, em milissegundos. milissegundos. 14 Aula 03 Terminal Interativo – PSQL – Meta dados \w {nome_do_arquivo | |command } |command} Escreve o buffer de comando corrente no arquivo nome_do_arquivo, nome_do_arquivo, ou envia para o comando Unix comando atravé através de um pipe. pipe. \x Alterna o modo de formataç formatação de tabela estendido. Sendo assim, equivale a \pset expanded. expanded. \z [ padrão ] Produz uma lista contendo todas as tabelas disponí disponíveis, junto com seus privilé privilégios de acesso. Se padrão for especificado, somente as tabelas cujos nomes nomes correspondem ao padrão são listadas. Os comandos GRANT e REVOKE são utilizados para para definir os privilé privilégios de acesso. Veja o comando GRANT para obter mais informaç informações. Este comando é um outro nome para o comando \dp ("display privileges"). privileges"). \! [ comando ] Abre um outro interpretador de comandos do Unix, ou executa o comando comando Unix comando. Os argumentos não são mais interpretados, sendo enviados para o interpretador de comandos como estão. \? Mostra informaç informação de ajuda para os comandos de contrabarra ("\ ("\"). Aula 03 Utilizando o PSQL A última linha exibida pelo psql é o prompt, prompt, indicando que o psql está está aguardando você, e que você pode digitar comandos SQL dentro do espaç espaço de trabalho mantido pelo psql. Tente usar estes comando: template1=> SELECT version(); version(); version ---------------------------------------------------------------PostgreSQL 8.0.0beta3 on i686i686-pcpc-mingwn32, compiled by GCC 3.2.3 (1 row) row) template1=> SELECT current_date; current_date; date -----------20042004-1010-21 (1 row) row) template1=> SELECT 2 + 2; ?column? column? ---------4 (1 row) row) 15 Aula 03 Manipulando Base de Dados – PSQL Manipulando a base de dados passo a passo. 1) Criar uma tabela chamada filmes template1=> create table filmes ( nome varchar(40), varchar(40), ano smallint, smallint, diretor varchar(30)); varchar(30)); CREATE template1=> No exemplo foi criada uma tabela de nome filmes com os campos: nome, tipo varchar com tamanho má máximo de 40. ano, tipo smallint. smallint. diretor, tipo varchar com tamanho má máximo de 30 caracteres. Aula 03 Manipulando Base de Dados – PSQL 2) Inserir dados dentro desta tabela template1=> insert into filmes values template1template1-> ('Morango e Chocolate',1993,'Tomas Gutierrez'); INSERT 18433 1 template1=> insert into filmes values template1template1-> (‘ (‘Guerra nas Estrelas I',1980,‘ I',1980,‘Spilberg'); Spilberg'); INSERT 18434 1 template1=> insert into filmes values template1template1-> (‘ (‘Guerra nas Estrelas II',1980,‘ II',1980,‘Spilberg'); Spilberg'); INSERT 18435 1 A sintaxe do comando é: INSERT INTO table VALUES (val1,val2,...,valN ); (val1,val2,...,valN); Note que as strings devem ser delimitadas por aspas simples. 16 Aula 03 Manipulando Base de Dados – PSQL Para acessar os dados da tabela precisamos fazer uma query. query. template1=> select * from filmes; nome | ano |diretor ----------------------------------+ ----------------------------------+------+ ------+--------------------Morango e Chocolate |1993|Tomas Gutierrez Guerra nas Estrelas I |1990|Spilberg |1990|Spilberg Guerra nas Estrelas II |1990|Spilberg |1990|Spilberg (3 rows) rows) Usamos o comando Select para fazer as consultas. SELECT campo1,campo2,...,campoN campo1,campo2,...,campoN FROM table; table; Veja outros exemplo: template1=> select nome,ano from filmes; nome | ano ----------------------------------+ ----------------------------------+---Morango e Chocolate |1993 Guerra nas Estrelas I |1990 Guerra nas Estrelas II |1990 (3 rows) rows) Aula 03 Manipulando Base de Dados – PSQL template1=> select * from filmes where diretor=‘ diretor=‘Spilberg'; Spilberg'; nome | ano |diretor ----------------------------------+ ----------------------------------+-----+ -----+----------Guerra nas Estrelas I |1990|Spilberg |1990|Spilberg Guerra nas Estrelas II |1990|Spilberg |1990|Spilberg (2 rows) rows) No segundo exemplo vemos a clá cláusula where que serve para selecionar os registros que queremos ver. A sintaxe é WHERE campo1 operador valor1,..., campoN operador valorN Outra claú claúsula interessante é a ORDER BY que permite mostrar uma tabela ordenada por um campo. Veja o exemplo: template1=> select * from filmes order by nome; nome | ano |diretor -----------------------------------+ -----------------------------------+-----+ -----+--------------------Guerra nas Estrelas I |1990|Spilberg |1990|Spilberg Guerra nas Estrelas II |1990|Spilberg |1990|Spilberg Morango e Chocolate |1993|Tomas Guitierrez Alea (3 rows) rows) 17 Aula 03 Manipulando Base de Dados – PSQL Cometemos um erro nos dados que entramos, ``Guerra nas Estrelas II'' não foi feito no mesmo ano que o primeiro. Para corrigir isso vamos executar o seguinte seguinte comando template1=> update filmes set ano=1991 where nome='Guerra nas Estrelas II'; UPDATE 1 A sintaxe do UPDATE é UPDATE table name SET campo1=valor1,..., campoN= campoN=valorN A claú claúsula WHERE do UPDATE é igual à do SELECT. Ela é muito importante pois diz para o postgres quais registros devem ser modificados, se você não colocacoloca-la ele modifica todos os registros. Veja abaixo como a tabela ficou depois do UPDATE: template1=> select * from filmes; nome | ano |diretor ---------------------------------+ ---------------------------------+------+ ------+--------------------Morango e Chocolate |1993 |Tomas Gutierrez Guerra nas Estrelas I |1990 |Spilberg |Spilberg Guerra nas Estrelas II |1991 |Spilberg |Spilberg (3 rows) rows) Aula 03 Manipulando Base de Dados – PSQL Muito parecido com o comando UPDATE é o comando DELETE. Nele també também claú claúsula WHERE é muito importante, se você esqueceesquece-la vai apagar todo o seu banco de dados, por isso digitedigite-o com cuidado. template1=> delete from filmes where diretor='Tomas Gutierrez'; DELETE 1 A sintaxe do DELETE é muito simples, novamente a clausula WHERE é igual ao do SELECT. Note que eu não a coloquei na sintaxe do comando. É porque ela não é obrigató obrigatória, apesar de raramente o DELETE ser usado em ela. DELETE FROM table name Esses foram os comandos bá básicos da linguagem SQL. Agora vamos ver alguns tó tópicos mais avanç avançados. O primeiro deles serão os índices. Eles são muito importantes pois tornam as querys com clausú clausúla WHERE e ORDER BY muito mais rá rápidas. Você pode indexar qualquer campo de uma tabela, só só que quanto mais campos você indexar mais lenta ficam as operaç operações INSERT e UPDATE. Vamos então indexar o campo nome. template1=> create unique index filmes_nome on filmes (nome); CREATE 18 Aula 03 Manipulando Base de Dados – PSQL A sintaxe de CREATE INDEX é CREATE INDEX index name ON table name (campo) No nosso exemplo usamos a claú claúsula opcional unique que faz com que o postgres não aceite informaç informações repetidas no campo indexado. Ou seja na nossa tabela não pode pode haver dois filmes com o mesmo nome. Claro que isso não faria sentido no no campo ano. Vamos supor que você comprou todos os filmes do Spilberg e quer cadastracadastra-los no seu banco de dados. Em cada um dos registros você vai ter digitar o nome do diretor, se mais e uma pessoa for digitar os registros uma pode digitar ‘‘Steven ‘‘Steven Spilberg’’ Spilberg’’,, outro digita somente ‘‘Spilberg ‘‘Spilberg’’’’,, da para imaginar o problema que você teria para fazer uma query que mostrasse todos os filmes do Spilberg. Spilberg. Uma soluç solução para esse problema é você criar duas tabelas, uma para os filmes e outra para os diretores, e relacionar relacionar as duas por um campo, de preferência numé numérico. Apague a tabela que você criou com comando: template1=> drop table filmes; DROP E crie uma nova tabela filmes template1=> create table filmes (nome varchar(40), varchar(40), ano int, diretor int); CREATE Aula 03 Manipulando Base de Dados – PSQL Note que o campo diretor agora é um numero inteiro. Como vamos ter uma tabela só só para diretores, podemos por informaç informações ligadas ao diretor nessa tabela, como por exemplo, a nacionalidade dele. Veja que podemos por quantas informaç informações quisermos na tabela de diretores que ela não vai se repetir em cada registro da tabela filmes, assim economizamos espaç espaço em disco e evitamos informaç informações redundantes. template1=> create table diretores (id int, nome char(30), char(30), nacionalidade char(10), char(10), unique(id)); unique(id)); NOTICE: CREATE TABLE/UNIQUE will create implicit index diretores_id_key for table diretores CREATE Note que a sequencia unique(id) unique(id) já já indexa o campo id da tabela diretores. Esse campo id é muito importante, pois é com ele que nó nós vamos relacionar o campo diretores na tabela filmes. Antes de inserir os filmes vamos inserir os diretores template1=> insert into diretores values (0,'Steven (0,'Steven Spilberg','Americano'); Spilberg','Americano'); INSERT 18527 1 template1=> insert into diretores values (1,'Ewa Polones'); '); (1,'Ewa Karpoff',' Karpoff','Polones INSERT 18528 1 19 Aula 03 Manipulando Base de Dados – PSQL Agora insira os filmes template1=> insert into filmes values ('A volta dos que nao foram',1990,1); INSERT 18529 1 template1=> insert into filmes values ('A volta dos que nao foram II',1991,1); INSERT 18530 1 template1=> insert into filmes values ('De volta pro futuro',1985,0); INSERT 18531 1 Veja que no campo diretor nó nós colocamos o nú número id dele que aparece na tabela de diretores. Tente agora mostrar os dados da tabela filmes template1=> select * from filmes; A volta dos que nao foram A volta dos que nao foram II De volta pro futuro |1990| |1991| |1985| 1 1 0 Usando duas tabelas relacionadas nó nós eliminamos o problema de dados redundantes, mas criamos outro. Agora em vez de aparecer o nome dos diretores aparece aparece um monte de números, algo difí difícil para seres humanos lidarem. Mas não precisa se preocupar com um query um pouco mais complexa podemos resolver esse problema. Aula 03 Manipulando Base de Dados – PSQL template1=> select filmes.nome,filmes.ano,diretores.nome from filmes,diretores where filmes.diretor=diretores.id; De volta pro futuro |1985|Steven |1985|Steven Spilberg A volta dos que nao foram |1990|Ewa |1990|Ewa Karpoff A volta dos que nao foram II |1991|Ewa |1991|Ewa Karpoff Veja que a clausula from tem duas tabelas, isso é necessá necessário porque a informaç informação agora está está espalhada por mais de uma tabela. A capacidade de juntar vá várias tabelas em uma única query é a capacidade mais importante de linguagem SQL. Veja també também que a agora temos dois campos nome, um na tabela filmes e outro na tabela diretores, diretores, para diferenciadiferencia-los especificamos o nome da tabela antes do nome do campo, separando separando os dois por um ponto. Outra coisa importante é a clausula WHERE que diz para o postgres que o campo diretor da tabela filmes se relaciona com campo id da tabela tabela diretores. 20 Término da Aula Aula 03 21