Introdução
Como você deve saber, o PostgreSQL foi projetado para extensibilidade e personalização, isso significa que podemos estender a funcionalidade do seu banco de dados usando extensões. A funcionalidade de extensão do PostgreSQL permite agrupar vários objetos SQL em um único pacote que pode ser carregado ou removido do seu banco de dados. Depois de carregá-lo em seu banco de dados, as extensões podem funcionar como recursos internos.
O banco de dados PostgreSQL possui muitos recursos e oferece uma ampla variedade de tipos de dados, funções, operadores etc. Mas às vezes não é suficiente para alguns casos de uso. Podemos facilmente estender a funcionalidade do PostgreSQL por meio de extensões. Este é um recurso muito útil para desenvolvedores e administradores de banco de dados.
Neste blog, podemos cobrir duas coisas abaixo.
- Como usar a extensão suportada pela comunidade PostgreSQL
- Como criar e usar extensão no PostgreSQL
Como usar as extensões suportadas pela comunidade PostgreSQL
Existem vários módulos/extensões de contribuição no PostgreSQL. Esses módulos são mantidos pela comunidade PostgreSQL. Podemos usar esses módulos e sua funcionalidade no PostgreSQL criando uma extensão.
Vamos ver como usar a funcionalidade da extensão hstore no PostgreSQL.
Extensão Hstore
O módulo hstore implementa o tipo de dados hstore que armazena pares chave-valor em um único valor. Podemos usar o tipo de dados hstore em muitos casos, como dados semiestruturados ou linhas com muitos atributos que raramente são consultados. Observe que as chaves e os valores são apenas strings de texto. Para usar esta funcionalidade, precisamos criar uma extensão para ela no PostgreSQL.
Vamos ver como usar o tipo de dados hstore.
CREATE TABLE books (
book_code serial primary key,
book_title VARCHAR (20),
attr hstore
);
Antes de criar o tipo de dados hstore, você precisa habilitar a extensão hstore que carrega o módulo contrib no seu PostgreSQL.
CREATE EXTENSION hstore;
Existem várias funções hstore para recuperar dados do banco de dados. Você pode verificar as funções e exemplos aqui.
Verifique os módulos adicionais fornecidos no PostgreSQL.
Como criar uma extensão
A extensibilidade é um dos recursos mais poderosos do PostgreSQL. Você pode adicionar novas funcionalidades para um caso de uso específico usando o módulo contrib e instalá-lo usando CREATE EXTENSION.
Nesta seção, vamos aprender como criar um módulo contrib simples e como usar sua funcionalidade no PostgreSQL.
Arquivos de extensão
Para poder executar o comando CREATE EXTENSION em seu banco de dados, sua extensão deve precisar de pelo menos dois arquivos:
- Arquivo de controle
O formato do arquivo deve ser extension_name.control, que informa o básico sobre extensão ao PostgreSQL, e deve ser colocado no diretório SHAREDIR/extension da instalação. - Arquivo de script SQL
O arquivo no formato extensão--versão.sql contém as funções que você gostaria de adicionar.
O formato de arquivo do arquivo de controle na extensão é o mesmo do arquivo postgresql.conf, ou seja, uma lista de atribuições de parâmetro_name =valor, uma por linha.
Exemplo
Verifique o exemplo completo abaixo de uma extensão somente SQL, crie uma função NVL compatível com Oracle no PostgreSQL. Existem muitos casos, mas aqui podemos considerar apenas um caso, por exemplo.
O arquivo de script SQL nvlfunc--1.0.sql se parece com isso...
Nvlfunc--1.0.sql arquivo:
--complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION nvlfunc" to load this file. \quit
CREATE OR REPLACE FUNCTION public.NVL(SMALLINT,SMALLINT)
RETURNS SMALLINT AS $$
SELECT COALESCE($1,$2);
$$ LANGUAGE SQL IMMUTABLE;
O arquivo de controle nvlfunc se parece com isso...
Arquivo Nvlfunc.conntrol:
# nvlfunc extension
comment = 'Oracle compatible nvl function'
default_version = '1.0'
module_pathname = '$libdir/nvlfunc'
relocatable = false
Embora você dificilmente precise de um makefile para instalar esses arquivos no diretório correto, você pode usar um Makefile contendo isso:
Makefile:
EXTENSION = nvlfunc
DATA = nvlfunc--1.0.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
Se você implementou a função usando a linguagem ‘C’, então você precisa adicionar o arquivo no makefile.
Instalação
O comando make install instalará o arquivo de controle e o arquivo de script sql no diretório correto conforme relatado por pg_config.
Após a instalação dos arquivos, use o comando CREATE EXTENSION para carregar os objetos em qualquer banco de dados específico no PostgreSQL.
Por favor, verifique os seguintes passos para instalar a extensão nvlfunc e você também pode adicionar este arquivo em seu diretório de extensão:
Arquivo INSTALL.nvlfunc:
This module is a PostgreSQL extension which provides the Oracle compatible nvl function feature.
Use below command in source directory of nvlfunc to install the module.
make install
Then use the below command to create extension nvlfunc in database.
CREATE EXTENSION nvlfunc;
Use the below command to remove the nvlfunc extension from database.
DROP EXTENSION nvlfunc;
Use below command in source directory of nvlfunc to uninstall the module.
make uninstall
Note:
This extension module requires PostgreSQL 9.1 or later because CREATE EXTENSION
feature is available in PostgreSQL 9.1 and later version.
As extensões do PostgreSQL devem ser instaladas em seu banco de dados antes que você possa usar suas funcionalidades. Para instalar uma extensão específica, execute o comando CREATE EXTENSION do psql para carregar os objetos empacotados no banco de dados.
Baixe o whitepaper hoje PostgreSQL Management &Automation with ClusterControlSaiba o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o PostgreSQLBaixe o whitepaper
Teste
Depois de criar a extensão, é recomendável criar um caso de teste para essa extensão para que, ao instalar este módulo em uma versão diferente do PostgreSQL, você possa verificar se todos os casos de teste estão funcionando conforme o esperado ou não.
Esta é uma etapa opcional, mas você pode criá-la. Os casos de teste ficam assim:
arquivo sql/nvlfunc.sql:
SELECT NVL(NULL::SMALLINT, 11::SMALLINT);
Em seguida, você pode adicionar a saída esperada em outro arquivo. O arquivo de saída esperado se parece com isso:
arquivo esperado/nvlfunc.out:
SELECT NVL(NULL::SMALLINT, 11::SMALLINT);
nvl
-----
11
(1 row)
Este é apenas um exemplo, é por isso que apenas um caso de teste é adicionado. Mas ao criar uma nova extensão, você pode adicionar mais casos de teste.
Estrutura de diretórios da extensão Nvlfunc:
# mkdir nvlfunc
# cd nvlfunc
# ls
Makefile nvlfunc.control nvlfunc--1.0.sql sql expected INSTALL.nvlfunc README
Prós
- Fácil de estender a funcionalidade do PostgreSQL
- Muito fácil de criar e instalar a extensão
- Fácil de testar regressões em diferentes versões do PostgreSQL
Contras
- Não há contras especiais, mas teste o recurso que você está adicionando na extensão antes de usá-lo.
Conclusão
A extensibilidade do PostgreSQL é um recurso muito poderoso, você pode criar sua própria extensão para casos de uso específicos e usá-la em seu banco de dados de produção. Existem muitas extensões suportadas pela comunidade PostgreSQL como hstore, postgres_fdw, dblink etc. e extensões de terceiros como Orafce, todas usadas para casos de uso particulares.