Gerando dados com DataFiller

Figura1_CapaPostRecentemente um colega da área postou um concurso para incentivar a comunidade PostgreSQL a escrever artigos. Neste post vou apresentar a minha participação descrevendo a experiência que tive ao utilizar a ferramenta DataFiller para gerar dados de teste no PostgreSQL.

O meu colega Fábio Telles é um especialista em no SGBD PostgreSQL que, inclusive, já até participou de um episódio do DatabaseCast onde falamos sobre história deste banco de dados. Recentemente ele publicou no seu blog (http://savepoint.blog.br/concurso-melhor-artigo-sobre-postgresql/) um concurso para incentivar a comunidade a escrever artigos sobre o PostgreSQL.

Apesar de eu não utilizar muito este banco de dados, resolvi participar escrevendo este post. Dentre as opções sugeridas eu escolhi falar sobre a ferramenta de geração de dados de teste chamada DataFiller (https://www.cri.ensmp.fr/people/coelho/datafiller.html). Este tópico me interessou porque já escrevi sobre ferramentas para geração de dados no artigo “Criando uma base de dados de teste” publicado na revista SQL Magazine número 83 e escolhido para ser a capa desta edição da revista.

Figura2_capaSQL83_GLogo que abri a página do projeto e estudei um pouco o conteúdo vi que o DataFiller é uma ferramenta que assume a forma de um script. Com um PostgreSQL 9.4 instalado em uma das minhas máquinas virtuais rodando o Ubuntu 15 logo fiz o download utilizando o wget e coloquei a permissão no script com o chmod.

$wget https://www.cri.ensmp.fr/people/coelho/datafiller
$chmod 777 datafiller

O objetivo desta ferramenta é gerar dados de teste para preencher bases de dados. Ele faz isso de uma maneira um pouco incomum: através da alteração do arquivo que contém a definição das tabelas. As alterações no script basicamente se resumem à colocação de comentários especiais que vão indicar detalhes da geração de dados, tais como a quantidade e o formato.

Antes de abrir um script eu tentei rodar um dos exemplos do tutorial que utilizam o parâmetro –test. Eu criei uma nova base no PostgreSQL chamada library e rodei o comando abaixo, que consta na documentação do projeto:

$./datafiller --test=library -T --size=1000 | psql libray

Infelizmente eu tive um erro indicando que eu deveria fornecer um generator, como a figura abaixo mostra. Bem, analisando a documentação não entendi muito bem este erro e fiquei com a impressão que faltou algo a ser indicado neste exemplo.

Figura3_ErroVoltei meus esforços para a modificação de um script simples. Eu criei uma tabela chamada test com um campo do tipo serial e forneci o comentário – df: multi=2. É importante destacar que este comentário foi colocado no final da linha que contém o comando create table, como indicado abaixo.

CREATE TABLE test( -- df: mult=2
id serial PRIMARY KEY
);

O parâmetro mult=2 vai indicar quantas linhas vão ser colocadas na tabela. Na verdade, ele vai indicar o fator multiplicador do valor do parâmetro –size indicado na chamada do DataFiller. Por exemplo, se a chamada abaixo utilizar o valor 1000 ao final da execução do script 2000 linhas (1000* o fator 2) vão ser inseridas na tabela. A propósito, o script que o DataFiller gera como resultado da sua execução criou um novo objeto sequence para preencher os dados da minha tabela de teste. A chamada ficou assim:

$datafiller --size=10 test.sql > test_data.sql

E o conteúdo do arquivo test_data.sql ficou assim:

-- data generated by ./datafiller version 2.0.0 (r792 on 2014-03-23) for postgr$
-- fill table test (20)
\echo # filling table test (20)
COPY test (id) FROM STDIN (ENCODING 'UTF-8');
1
2
3
4
5
6
7
8
9
10
...
20
\.
-- restart sequences
ALTER SEQUENCE test_id_seq RESTART WITH 21;
-- analyze modified tables
ANALYZE test;

Depois de rodar o novo script no banco de destino (que precisa ter a tabela já criada) verifiquei que a inserção foi feita sem problemas. Sem grandes dificuldades até aqui.

Também fiz alguns testes com a geração de strings para colunas com conteúdo de caracteres. Para isso eu empreguei o gerador de texto que permite, entre outras opções, utilizar expressões regulares. Como exemplo, fiz a geração de dados para uma coluna com 10 caracteres gerados aleatoriamente dentro o intervalo A-Z. O meu script com a definição da tabela ficou assim:

CREATE TABLE test( -- df: mult=2
id serial PRIMARY KEY,
titulo text not null --df: chars='A-Z' length=10 lenvar=0
);

A chamada do programa DataFiller na linha de comando foi idêntica e não tive nenhum problema para gerar os dados. Até aqui, o DataFiller funcionou bem e recomendo ele para quem trabalha exclusivamente com a linha de comando e já contém os scripts do banco. A propósito, quem já possui os scripts do banco talvez possa ter trabalhado relativamente grande para alterá-los e incluir os comentários necessários para indicar como será a geração de dados.

Figura2_GenerateDataOutras ferramentas semelhantes são mais limitadas, porém elas não exigem a modificação do script a definição das tabelas. Por exemplo, o site Generatedat.com permite a especificação de detalhes para a geração de dados e fornece arquivos que podem ser importados. Contudo, este site não faz nenhuma integração com o banco de dados e possui poucas opções de customização.

Alias, o DataFiller brilha neste sentido: é possível customizar diversas opções para geração de dados. Dentre as várias opções, a que me chamou à atenção foi a possibilidade de gerar dados para tabelas relacionadas. Fiz alguns testes e verifiquei que é muito interessante poder indicar a proporção de dados que vão ser colocadas nas tabelas Pai e Filho de relacionamentos com cardinalidade 1:N. Certamente esta é uma das grandes vantagens do DataFiller que pode ajudar muito no dia a dia de quem tem que gerar dados e não quer se preocupar muito com o relacionamento das tabelas.

Em resumo, posso indicar o DataFiller para quem precisa gerar dados exclusivamente para ao PostgreSQL e já possui o esquema de criação das tabelas em um arquivo. Além disso, vale a pena destacar a versatilidade e possibilidade de geração para valoreis incluindo a indicação de proporções, valores médios e distribuições (normal, exponencial, pareto, etc) para os dados das colunas. Estes recursos são muito importantes para quem deseja gerar dados de teste mais “reais” e próximos ao que pode-se encontrar em uma base de produção.

Como sugestão, seria interessante que a ferramenta produzisse arquivos no formato CSV, XML ou JSON para facilitar a importação em outros tipos de bancos de dados. Também não seria uma má ideia alguma maneira de criar templates para indicar as mesmas configurações para várias tabelas, uma vez que alterar manualmente o script que a definição de muitas tabelas (modelos de dados “grandes”) pode ser uma tarefa muito tediosa e sujeita a erros.



Esta entrada foi publicada em Programação, SQL e marcada com a tag , , , , , . Adicione o link permanente aos seus favoritos.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>