Postgres – Campos arrays, perl, hash e … pog

Primeiros, a definição: POG: Postgres Oriented Gambis!

Brincadeiras a parte, vamos lá: eu tenho certeza que você já quis colocar uma array no banco
(por exemplo, todos os telefones de uma pessoa) sem ter que criar outra tabela para criar a relação.

Agora que você esta ciente dos riscos, da quantidade de POG [dessa vez programação orientada a gambi mesmo] que você irá fazer, continuaremos.

Adicionar um novo campo com os telefones seria fácil demais:

create table blabla (
	id_blabla bigiserial,
	telefones text[]
);

Porém, você só poderia ter os telefones assim:

{
    '1234-2222', 123342123, 23212
}

Mas aí surgem necessidades como, separar o DDD, saber se é FAX, se tem ramal, etc…

Então, na mais pura maldade pensei:
“pow, seria muito legal ter um HASH ai nesse campo…”

Como a preguiça também é grande, não quis criar um TYPE do postgres, pois seria dispersão de tempo,
afinal este campo não precisa de search, é so um lugar pra jogar esta informação antes dela ser mais refinada.

Aí pensei, “Hmm, uma array de array resolveria o problema, ‘bora fazê’”:

Deixe assim:

create table blabla (
	id_blabla bigiserial,
	telefones text[][]
);

Pronto, agora você pode fazer isto:

{
    {tel,'1234-2222'},
    {tel,123342123},
    {tel,23212}
}

Assim, você salva chave, valor, chave, valor….

Em perl, é bem simples transformar um HASH em Array [tem várias formas também]:
A que eu utilizei foi esta:

        # Array de HASH
        my $array_de_hash = [{tel => 123, ddd => 11}, ... ];
        # array que vc vai colocar enviar ao banco
        my @as_array;
        foreach my $i (@$array_de_hash ) {
	        if (ref $i eq 'HASH') {
	                my @sub_array;
                        foreach my $k (keys %$i){
                                push(@sub_array, $k, $i->{$k});
                        }
                        push(@as_array, @sub_array);
                }else{
                        push(@as_array, $i);
                }
        }
        $array_de_hash = $database->quote( @as_array );

Este é um exemplo muito básico, e não tem recursividade, mas funciona para casos simples.

Falta o código perl pra montar o $array_de_hash novamente, mas acho que é só você fazer um foreach seguido de %hash = @valores;

 

{
    {matchkey,6868465D6A6E5660,telephone,11111111,extension,"",
      other,"",status,000000000000001,ddd,11}
}

Cheers

This entry was posted in Databases. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>