sexta-feira, 5 de abril de 2013

Trate com BLOBs e CLOBs Diretamente no PSQL!


Armazenar grandes objetos binários (Binary Large Objects - BLOBs), tais como vídeos, imagens e arquivos PDF, e grandes objetos textuais (Character Large Objects - CLOBs) em um banco de dados é uma atividade que pode apresentar dificuldade maior que a vivenciada em se lidar com tipos de dados tradicionais.

Cada SGBD apresenta sua padronização e o PostgreSQL apresenta seus métodos de armazenamento, exclusão e recuperação de BLOBs e CLOBS. A portabilidade entre SGBDs não costuma ser fácil neste caso.

 Lidar com Large Objects pode não ser tão trivial!


Um recurso bastante simples para lidar com estes grandes objetos dentro do postgres é disponibilizado de dentro do psql, objeto deste post.

Quatro funções permitem operações sobre large objects, viabilizando a sua criação, recuperação, consulta e exclusão:
- \lo_import ARQUIVO [COMENTÁRIO] - Importa um arquivo do filesystem (levando em conta a search_path) para o postgresql, atribuindo ao mesmo um identificador de objeto (OID) e um comentário, quando fornecido este parâmetro
- \lo_list - Apresenta uma listagem dos objetos binários importados
- \lo_export OIDLOB ARQUIVO - Exporta um BLOB ou CLOB do postgres para o filesystem sem removê-lo do postgresql, referenciando-o pelo seu OID
- \lo_unlink OIDLOB - Elimina um large object do postgresql com base no seu OID.

Abaixo, sem a preocupação de esgotar este tema, a demonstração do tratamento de BLOBs e CLOBs no postgres via psql.

* Listagem de grandes objetos (large objets) armazenados

postgres-# \lo_list
Objetos grandes
 ID | Descrição
----+-----------
(0 registro)

* Recuperação dos caminhos da Serch_path, utilizados para recuperar arquivos para o psql




postgres=# SHOW search_path;
  search_path  
----------------
 "$user",public
(1 registro)





* Importação de Arquivos

postgres=# \lo_import arqdoc.doc
lo_import 16400 (OID DO NOVO ARQUIVO IMPORTADO)
postgres=# \lo_import arqpdf.doc 'Arquivo Binario PDF'
não pôde abrir arquivo "arqpdf.doc": Arquivo ou diretório não encontrado
postgres=# \lo_import arqpdf.pdf 'Arquivo Binario PDF'
lo_import 16401
postgres=# \lo_import arqpng.png 'Arquivo PNG'
lo_import 16402
postgres=# \lo_list (LISTAGEM DE ARQUIVOS IMPORTADOS)
       Objetos grandes
  ID   |      Descrição     
-------+---------------------
 16400 |
 16401 | Arquivo Binario PDF
 16402 | Arquivo PNG
(3 registros)

* Exclusão de arquivo previamente importado

postgres=# \lo_unlink 16401
lo_unlink 16401
postgres=# \lo_list
   Objetos grandes
  ID   |  Descrição 
-------+-------------
 16400 |
 16402 | Arquivo PNG
(2 registros)









* Exportação de arquivo do postgresql para o filesystem

postgres=# \lo_import novofile.pdf
lo_import 16403
postgres=# \lo_export 16403 testeexport.pdf (gera o arquivo testeexport.pdf no filesystem)

* Importação de CLOB

postgres=# \lo_import miniclob.txt 'Arquivo CLOB'
lo_import 16405
postgres=# \lo_list
   Objetos grandes
  ID   |  Descrição  
-------+--------------
 16400 |
 16402 | Arquivo PNG
 16403 |
 16404 |
 16405 | Arquivo CLOB
(5 registros)





* Considerações Finais


Prefiro trabalhar com large objects no filesystem, ao invés de registrá-los no próprio banco de dados.O acréscimo de mais uma camada reduz a portabilidade e a velocidade de acesso, mas tende a aumentar de certa forma a segurança e a facilitar operações de backup e recovery.

Caso se deseje utilizar este recurso na aplicação, utilizando as funções dentro do SQL, o postgresql apresenta o recurso das Server-Side Functions, bastante similar e que oferece maior controle.

E você, como lida com os seus BLOBs e CLOBs?

Nenhum comentário: