Programando às cegas: turbinando a sua produtividade Usando o DBEaver com leitores de telas
Summary
Como usar DBEaver com NVDA
Salve, galera!
Trabalhar com banco de dados é algo importante e muito possivelmente vai fazer parte da vida de todo mundo que desenvolve software.
No artigo de hoje, vamos trazer algumas dicas de como usar o DBEaver, um cliente integrado que oferece suporte a uma série de bancos de dados diferentes através de uma interface completa e acessível.
O que está acontecendo?
Mas, primeiro, como sempre, um pouco de teoria:
A maioria dos sistemas de bancos de dados opera em um esquema cliente server.
Isso significa que o banco de dados em si é um servidor que atende a requisições (para consulta, inserção, entre outros) de clientes, através de um ou mais protocolos de comunicação, como se fosse um web server que atende a navegadores ou outros clientes através do protocolo http.
Da mesma maneira que web servers, como o Apache, não apresentam (com raras exceções) interfaces gráficas, também os servidores de bancos de dados (com raras exceções) não apresentam interfaces gráficas.
Em vez disso, servidores de banco de dados atendem a clientes através de determinados protocolos (normalmente TCP, mas pode haver outros) e os clientes (aqui na analogia como se fossem os navegadores) são usados por pessoas ou por softwares para interagirem com esses servidores.
A, querido altor, chegou aquela hora onde eu provo, com toda certeza, que você é um idiota pretensioso completo e não sabe nada do que está falando, pois eu instalei o mysql na minha máquina e uso ele direto, e também uso o SQL server que eu instalei. Também uso o sqlite, tudo da minha máquina, sem conectar em qualquer servidor.
Novamente, querido leitor, talvez eu possa ser uma ou mais dessas coisas, mas definitivamente não será por isso.
Quando você instalou o mysql em sua máquina, instalou o servidor (que é o banco de dados em si) e também um cliente. Este cliente se conecta na sua própria máquina no servidor, e por isso você tem a sensação de que está usando uma coisa apenas.
Da mesma forma, o Sql Server vem com um cliente, que você usa igualmente para se conectar na sua própria máquina.
E, antes que você me diga que instalou um sniffer de rede e não percebeu qualquer conexão (a, leitor, quanto trabalho para provar que eu estou errado … ) lembro que nem sempre o protocolo usado é o TCP, porém deixarei para você entender de quais outras maneiras alguns servidores de bancos de dados suportam IPC.
Por fim, o Sqlite é uma das “raras exceções” de sistemas de banco de dados que não são instalados como cliente server.
Ele, entretanto, também não oferece interface gráfica, disponibilizando suas funcionalidades através de uma biblioteca (.dll no Windows, .so em *nix) e disponibiliza um aplicativo cliente que, usando esta biblioteca, te permite navegar pelos bancos de dados presentes no sistema.
Sistemas unificados de acesso a bancos de dados
Mas porque toda essa teoria?
Respondo a esta pergunta com outra: você já parou para pensar que todos os principais sistemas de bancos de dados são algum tipo de servidor que oferece algum tipo de protocolo para que algum tipo de cliente os acesse?
Este é um padrão, dentro da despadronização dos sistemas de bancos de dados.
Você já parou, também, para pensar que cada sistema de banco de dados oferece um cliente específico para controlá-lo?
Isso mesmo. A linguagem principal pode ser a mesma (SQL), mas você vai precisar aprender a usar cada um dos clientes disponibilizados pelos diferentes sistemas de bancos de dados para operar cada banco de dados …
Acessibilidade? Varia, mas normalmente é sempre fraca para coisas mais complexas. Comodidade? Varia, mas no geral para quem depende de leitores de tela muitas das funcionalidades nativas de cada cliente, como completion de tabelas e etc funcionam pior do que poderiam. Gui ou CLI? Também varia, mas o que dificilmente varia é o fato de que, quando gui, ou não é acessível ou corre risco de não ser mais acessível a qualquer momento. Tudo varia, e varia muito.
Para quem enxerga, apenas um encômodo. Para quem não enxerga, falta de produtividade e dificuldades de aprendizado logo ali.
Porém … calma aí. Vamos parar para pensar: Os sistemas todos (pou boa parte deles) usam os mesmos protocolos. A linguagem é quase padronizada. Não daria para criar um cliente único que pudesse acessar todos esses bancos de dados?
Esta é exatamente a premissa de aplicações como o DBEaver. Elas atendem a uma necessidade de ter toda a complexidade e as variações de cada sistema de bancos de dados abstraídas e usarem uma interface única, confortável e, o mais importante para quem usa leitores de tela no caso do DBEaver, acessível.
DBEaver
Instalação
Para usarmos o DBEaver com mais efetividade, seguem algumas dicas:
- Baixe o DBEaver Community. Recomendamos que o Windows Installer seja baixado.
- Instale em seu NVDA o complemento Eclipse Enhance
- Instale o DBEaver normalmente.
- Abra o DBEaver. Como todos os ambientes baseados no Eclipse, a inicialização vai ser um pouco lenta.
- O Windows defender poderá abrir e pedir que você decida se quer excluir o DBEaver de scanning, para melhorar o desempenho. Decida o que entender mais apropriado para seu caso.
- Um diálogo perguntando se um database de exemplo deverá ser criado abrirá. Escolha sim, pois você poderá treinar com segurança o uso do DBEaver nesse banco de dados. E, antes de você perguntar qual sistema de banco de dados ele irá usar, isso é irrelevante, pois a interface será exatamente a mesma não importa o que você estiver usando como servidor de banco de dados. Mas, na insistência, eu te digo que neste caso o Sqlite será usado.
Conectando com um banco de dados
Sendo o DBEaver um cliente, você precisará antes de tudo se conectar a um ou mais servidores de bancos de dados.
O componente utilizado para gerenciar conexões é o Database Navigator, que pode ser acessado através do menu Window (alt + w), show views, database navigator.
Se acessar a janela, irá perceber que uma conexão com o DBEaver Sample Database já está configurada.
Ela estará representada como um nó na árvore de conexões.
Drivers
Devido ao grande número de sistemas de bancos de dados que o DBEaver suporta, os drivers para cada um não vem instalados por padrão.
Isso faz sentido, já que você dificilmente irá utilizar todos esses sistemas.
Para ver quais bancos de dados estão disponíveis nesta conexão de exemplo, experimente expandir a árvore no nó representado por ela: Você irá notar um diálogo dizendo que os drivers para o
Sqlite não estão instalados.
Selecione “download” e espere que o driver seja instalado. Você obviamente precisará fazer isso apenas uma vez para conexões que utilizam o Sqlite, mas precisará fazer isso outras vezes para acessar, por exemplo, Mysql, Postgres entre outros.
Após um curto tempo, o database navigator será novamente focado e, desta vez, se tentar expandir o nó representado pela conexão de exemplo, será possível ver as tabelas deste banco de dados.
Navegando pelos objetos de um banco de dados
A partir do Database Navigator, expandindo-se uma conexão, você terá acesso a todos os objetos deste banco.
Por objetos, entenda tabelas, views, índices e o que quer que o sistema de banco de dados em questão suporte.
No nosso banco de dados de exemplo, se expandirmos o nó de tabelas, encontraremos “álbuns”, “artists”, entre outras.
Expandindo-se qualquer tabela, veremos os objetos que a representam, tais como as colunas, as chaves, chaves estrangeiras , índices e outros.
Vejamos, por exemplo, a tabela de customers: expandindo-se as colunas, veremos que a tabela contém customerId, firstName, lastName, entre outros. Observe que os tipos de cada coluna também são exibidos.
Se você acha que esta maneira de explorar como cada tabela é composta é mais simples, rápida e produtiva, saiba que não stá sozinho (a).
Também é possível navegar pelas chaves. Por exemplo, podemos notar que esta tabela tem uma chave chamada PK_customers, disponível ao expandirmos o nós de Keys.
Da mesma forma, é possível saber que a tabela exporta uma chave estrangeira, ao expandir o nó foreign keys.
Ter acesso rápido a quais colunas são afetadas por uma chave, via interface gráfica, é menos produtivo do que poderia ser.
Logo, veremos uma outra estratégia para tanto.
Usando comandos sql
Para abrir o editor de sql, usamos o atalho f3.
O funcionamento do editor não é óbvio, embora a maioria dos clientes gráficos de bancos de dados funcionem da mesma maneira:
Você estará focado em um editor de textos padrão.
Nele, é possível digitar comandos sql, e você terá acesso ao auto complete das tabelas e outros objetos relativas à conexão ativa.
Pressione f3. Um diálogo vai se abrir perguntando qual script deve ser carregado. A sugestão será um arquivo chamado script.sql, que estará em branco por padrão.
Experimente selecionar algo da tabela de albums:
Comece a escrever “select. Ao pressionar s, uma lista de sugestões com a palavra “select” será exibida. Pressione tab para confirmar, e veja (usando as setas) que a palavra “select” foi inserida.
agora, digite * e pressione “f”, aceitando a palavra from que é exibida como sugestão.
Depois de confirmar, escreva a e veja que a tabela álbum será exibida como sugestão. Você poderá selecionar outras opções com as setas antes de confirmar. Algumas delas são artist, mediaType entre outras. Selecione álbum e pressione tab.
Observe o imenso valor que esta ferramenta adiciona a sua produtividade: você não precisa decorar e escrever exatamente o nome das tabelas em uma query, lembrando que, por convenção, tabelas de bancos de dados podem ter nomes longos, complexos e pouco intuitivos.
Mais do que isso: agora que a tabela da query está definida, se você apagar o * do select * e apertar, em vez disso, ctrl + espaço (para subir a lista de opções do auto complete), terá todas as colunas da tabela Album listadas e poderá selecionar a que preferir com as setas. Após confirmar com tab, se escrever “,” e pressionar ctrl + espaço novamente, a lista de colunas será novamente exibida, o que evitará que você tenha que, antes de tudo, decorar os nomes das colunas da tabela que está utilizando.
Para fins de exercício, vamos manter * como a definição das colunas a serem selecionadas.
Nossa query agora está assim: “SELECT * FROM Album a”
Executando queries
A partir de agora, preste extrema atenção:
Com o passar do tempo, acaba sendo muito comum que você tenha muitas conexões de bancos de dados configuradas.
Você terá, por exemplo, muito provavelmente uma conexão para o banco de dados da sua máquina local, e talvez uma conexão para o mesmo banco de dados, porém do ambiente de homologação ou desenvolvimento.
Obviamente, esses bancos de dados são diferentes. Uma query escrita no editor de SQL será rodada na conexão ativa no momento no seu DBEaver.
Se estiver fazendo um select e a conexão ativa for diferente do que você está esperando, o máximo que pode acontecer vai ser você perder minutos ou horas por estar lendo resultados sem qualquer sentido.
Mas se você estiver fazendo operações de escrita, tais como insert, delete, entre outras, poderá causar um enorme estrago em bases de dados que não são as que você achava que seriam.
Assim, sempre utilize ctrl + 9 para selecionar a conexão desejada, e ctrl + 0 para escolher o banco de dados / schema (caso haja mais de um banco de dados ou chema disponíveis) antes de executar uma query.
No nosso caso, pressionando ctrl + 9 veremos que existe apenas um data source, a nossa conexão de exemplo, disponível.
ctrl + 0 mostrará uma lista vazia, pois o Sqlite disponibiliza apenas uma base de dados ou schema por conexão.
Agora, vem a outra coisa pouco intuitiva:
Editores de query, tais como o que estamos, permitem que múltiplas queries sejam escritas.
No nosso caso, temos apenas uma linha no editor, mas poderíamos, por exemplo, ter logo abaixo dela uma outra linha, algo como “SELECT * from Artist a”.
O sistema precisa saber qual das duas queries executar.
No geral, ele espera que a query a ser executada esteja selecionada.
Você precisará tomar cuidado para selecionar apenas a query que deseja executar.
Nunca confie que o sistema estimará corretamente a query a ser executada, caso você não a selecione. Se você tiver uma query select e outra delete e não selecionar exatamente o que quer, pode acabar fazendo um delete em vez do seu select.
Sempre separe queries por uma ou mais linhas em branco, tenha extremo cuidado.
Com a certeza de que sua conexão ativa e banco (ou schema) são os desejados, selecione a query desejada com as setas.
Você pode ouvir o que selecionou pressionando tecla NVDA + shift + seta para cima.
Executando selects
- Selecione a query select * from Album a
- Pressione ctrl + enter.
- Você não ouvirá nada, nem nada, aparentemente, acontecerá.
- Pressione ctrl + tab.
- Tudo correndo bem, você estará em um grid parecido com o excel, onde poderá navegar e ler os registros de forma totalmente acessível. Quando estiver no grid, pressione a tecla tab uma vez para forçar a atualização do buffer, pois você poderá ainda (no buffer de acessibilidade) estar navegando por uma query anterior.
- Usando a tecla de aplicações, é possível acessar uma série de opções, inclusive editar valores direto do grid, o que muitas vezes é muito mais produtivo do que escrever uma query de update para corrigir algum erro ede valor em colunas que você acabou de inserir.
- Para retornar ao editor de sql, pressione ctrl + t. Você pode precisar pressionar este atalho mais de uma vez.
Executando queries de escrita
No editor, vamos inserir um novo artista.
digite i e selecione a palavra insert. Em seguida, digite i novamente e selecione a palavra into. Depois, digite a letra a e selecione a tabela Artist.
em seguida, digite ‘(‘ e pressione ctrl + espaço para acessar os nomes das colunas disponíveis.
Selecione a coluna Name, já que a ArtistId é preenchida automaticamente.
Você notará que o ‘)’ foi inserido automaticamente. Após este, digite values(‘test’)
A query, no final, ficará assim:
INSERT INTO Artist (Name) values (‘test’)
- Selecione a query.
- Pressione ctrl + enter.
- Aparentemente, nada acontecerá e nada será dito.
- Pressione ctrl + tab.
- Tudo correndo bem, você estará na aba de estatísticas, onde poderá com as setas acompanhar os efeitos que sua query causou no banco de dados.
Vemos que, neste caso, nossa query atualizou uma linha no banco, o que faz sentido, já que inserimos um registro. - Para voltar ao editor de sql, pressionamos ctrl + t.
Exercícios
Experimente selecionar de Artist onde nome for igual a ‘test’.
Lembre-se de que ctrl + espaço também pode ser usado depois da palavra where para listar as colunas disponíveis.
Depois, experimente trocar o nome do registro inserido de ‘test’ para ‘outro-test’
por fim, experimente deletar o registro que acabou de inserir.
Logo após, pressione ctrl + tab.
Lidando com erros
Mesmo que o auto complete nos impeça de cometer a maioria dos erros, oriundos de especificarmos nomes de tabelas, de comandos ou de colunas de maneira incorreta, ainda podemos cometer erros em nossas queries.
- Volte a query “select * from Album a” e a modifique. Coloque no nome da tabela “Albums” , assim ficando com “select * from albums a”.
- Selecione a query e pressione ctrl + enter.
- Aparentemente, nada acontecerá e nada será dito.
- Pressione ctrl + tab. Em vez de encontrar o grip de resultados, você estará na aba de estatísticas, como se tivesse executado uma query de escrita.
- Entretanto, se usar as setas, nenhuma estatística vai ser exibida. Em vez disso, apenas a query executada será exibida. Isso é um claro sinal de que um erro ocorreu.
- Para acessar o erro, pressione ctrl+shift+tab algumas vezes até que um campo editável com sua descrição seja focado.
- Aqui, vemos que o erro diz “database(no such table: albums), o que significa que a tabela Albums não existe neste banco de dados.
- Volte ao editor de sql pressionando ctrl + t. e corrija a query.
Conectando com outros bancos de dados
Ainda nos falta explorar como criar novas conexões com sistemas bancos de dados.
No caso da conexão com o banco de dados de exemplo, o próprio DBEaver a criou, mas precisaremos saber como criar nossas próprias.
Para este exercício, instale o MariaDB, que é um “novo nome” para o Mysql.
Dica bonus
Cansado (a) de ficar fazendo downloads de instaladores por aí?
Então venha ter a comodidade de instalar software como pacotes, que é algo que a maioria dos sistemas *nix já disponibiliza desde que eu consigo me recordar.
Instale o Chocolatey e depois, em um terminal, apenas digite “choco install mariadb”. Pronto, seu mariadb está instalado.
Criando um banco de dados
Normalmente, usamos o DBeaver para se conectar em bancos de dados já existentes.
Um sistema como o Sqlite pode gerenciar múltiplos bancos de dados (não confunda com sistema gerenciador de banco de dados), e a maioria dos outros sistemas, tais como o mysql (ou mariaDb), postgres entre outros faz a mesma coisa.
Entenda um banco de dados como um agrupador lógico de usuários, procedures, views, tabelas, e outros.
Isso significa que o Mysql pode, dentro do mesmo servidor (no caso sua máquina), gerenciar múltiplos bancos de dados que operam de maneira completamente isolada.
De fato, no sistema de arquivos (dependendo da implementação), cada banco de dados mysql é armazenado em um diretório diferente.
No caso do Sqlite, cada banco de dados é armazenado em um arquivo diferente.
Antes de nos conectarmos em um banco de dados no mysql precisaremos, portanto, criá-lo.
Uso do client do mariaDB
Para isso, em um terminal (windows + r, cmd, enter), digite:
mariadb -h127.0.0.1 -uroot
- mariadb – executável do cliente para o mysql / mariaDB
- -h especifica o endereço do host a ser acessado. No caso, usamos o ip de loopback 127.0.0.1 que está disponível em praticamente todas as máquinas que aponta para a própria máquina
-u – passamos o usuário root como credencial para acessar o servidor
Nesta configuração, o usuário root não precisa de senha em acessos vindos do próprio servidor, ou seja, da sua máquina
Criando um banco de dados
Digite
create database test;
E pressione enter.
Você ouvirá o NVDA ecoar de volta a saída deste comando, que deverá ser “query ok, 1 row affected.”
Criando um usuário
Digite o seguinte
CREATE USER 'test_user'@'127.0.0.1' IDENTIFIED BY 'test_pass';
Este comando cria um usuário no formato esperado pelo mysql, que é “nome_de_usuário@endereço_remoto_de_onde_o_usuário_pode_se_conectar”
No caso, criamos um usuário chamado “test_user”, que pode se conectar apenas a partir da mesma máquina onde o servidor mysql está instalado, com a senha (especificada logo após a parte IDENTIFIED) BY) “test_[pass”.
Executando este comando, temos uma saída como “query ok, 0 rows affected”.
Agora, nos falta dar ao usuário “test_user” as permissões para acessar o banco de dados “test” que acabamos de criar:
Digite
GRANT ALL PRIVILEGES ON test.* TO 'test_user'@'127.0.0.1';
Uma saída com “query ok” deverá ser obtida.
Por fim, digite
flush privileges;
E, novamente, uma saída com “query ok” deverá ser obtida.
Testando o novo usuário
digite “\q” para sair do cliente do mysql / mariaDb.
Você deverá estar de volta ao prompt de comandos.
Então, chegou a hora de nos conectarmos com nosso novo usuário no nosso novo banco de dados. Para isso, digite
mariadb -h127.0.0.1 -utest_user -p test
A senha será solicitada. Digite “test_pass’
- -h especifica o servidor a ser acessado
- -u especifica o nome de usuário logo após, no caso test_user
- -p especifica que uma conexão autenticada deverá ser feita (ou que uma senha deverá ser solicitada)
- test é o nome do banco de dados com o qual queremos nos conectar.
Ao apertar enter, você deverá ouvir detalhes da conexão.
Você pode testar alguns comandos. Por exemplo, tente digitar “show tables”e veja que nenhuma tabela foi criada neste banco de dados.
Conectando via dbEaver
- Abra o database navigator.
- Tecla aplicações na conexão já criada de exemplo. vá até create e depois até connection.
- A janela que se abre vai nos pedir para selecionar o sistema de banco de dados ao qual queremos nos conectar.
- Você pode digitar parte do nome do tipo de banco de dados no filtro ou deixar em branco para acessar todas as opções..
- pressione tab até a lista e escolha “maria db” pressionando enter.
- A tela de opções para o tipo de banco de dados selecionado aparece.
- Selecione tipo de servidor para host.
- No campo server host, digite 127.0.0.1
- No campo database, digite test.
- no campo user name, digite “test_user”
- No campo password, digite “test_pass”
- Procure e acione o botão “test connection”, para verificarmos que as opções digitadas funcionam adequadamente.
- Como esta é a primeira conexão com banco de dados mariaDB, o driver precisará ser baixado. Escolha “download”.
- Depois de um tempo, você ouvirá um resultado de erro de conexão. Ainda preciso descobrir o motivo disso.
Desconfio que, ao fazer o download e tentar o teste, algum dos campos preenchidos na tela é apagado. O DBEaver pode ficar instável neste caso, então feche e abra novamente.
Lembre-se que isso apenas acontecerá quando novos drivers precisam ser baixados, o que acontece apenas quando um novo tipo de banco de dados é usado pela primeira vez. - Faça o procedimento novamente. Desta vez, o teste de conexão não pedirá para baixar drivers (pois já foram baixados) e reportará sucesso.
- Clique em finish.
- Note, agora, que o database navigator exibe dois nós: a conexão de teste com o Sqlite e a conexão com o banco de dados test do mariaDB. Expanda esta última.
- Você notará que existe um banco de dados “test” e nenhuma tabela.
Criando tabelas
A partir de agora, você poderá acessar o editor SQL e executar queries, exatamente como fez com o banco de dados de teste do Sqlite.
Portanto, aperte f3 para ir ao editor de sql.
- Use ctrl + 9 para selecionar a conexão. Observe que, agora, aparecem duas, selecione a conexão test.
- Use ctrl + 0 para selecionar, dentro da conexão, o banco de dados desejado.
Em seguida, crie uma tabela.
Como você está criando uma tabela, o auto complete pode ajudar pouco com sintaxe.
Para fins de exemplo, a seguinte DDL deve funcionar:
create table test_table(
id INT not null auto_increment PRIMARY KEY,
notes VARCHAR(255)
);
Se digitar, selecionar, pressionar ctrl + enter e depois ctrl+tab, vai perceber que a tabela foi criada.
Pressione ctrl + t para voltar ao editor de sql.
Observe que este é exatamente o mesmo procedimento que usamos para executar queries no Sqlite.
Para fins de teste, volte na janela onde o client do mariaDb está aberto e digite novamente “show tables”;
Você notará que, agora, a tabela test_table foi criada.
Vamos inserir um registro na tabela.
No editor de sql, digite
insert into test_table (notes) values('primeira nota');
Novamente, selecione, pressione ctrl + enter e depois ctrl + tab, ara acessar o resultado.
Desta vez, uma linha foi afetada, o que significa que inserimos de fato um registro.
Pressione ctrl + t para voltar ao editor de sql.
Agora, vamos recuperar os registros da tabela. Digite
select * from test_table tt ;
Novamente, pressionando ctrl + tab você estará no grid de resultados, novamente da mesma maneira que com o banco de dados Sqlite.
Por fim, vamos criar uma outra tabela, porém sem qualquer ddl:
- Vá até o database navigator.
- Expanda a conexão test e o banco de dados test.
- Tecla applications em tables.
- Selecione create new table.
- Shift tab algumas vezes até o campo table name.
- Digite other_test_table
- Tab até a árvore de colunas. No meio do caminho, você passará pelo campo description, que é multi line e, portanto, captura o tab como um caracter de testo.
Use ctrl+tab para prosseguir em vez disso (não esqueça de apagar o tab que foi colocado no campo). - Para adicionar uma coluna, pressione tab para a barra de ferramentas e setas para a direita até o botão create new column.
- Vamos chamar a coluna de “id”.
- Selecione INT na combo de data type.
- Você pode digitar parte do valor e selecionar na lista filtrada pressionando enter.
- Marque not null.
- Marque auto increment.
- Marque o campo como uma chave, marcando a caixa de verificação keys.
- Selecione o tipo de chave como primary.
- Tab até ok.
- Você voltará na árvore de colunas, mas a coluna criada não será exibida. Para exibir, tab até a barra de ferramentas e aperte o botão refresh editor contents.
- Crie uma nova coluna, agora chamada notes, do tipo varchar, e not null.
- Por fim, tab até a barra de ferramentas e selecione preview changes and save.
20 Um editor apenas leitura com o sql a ser executado será exibido. Se estiver de acordo, clique em “execute”. Também é possível editar a queri acionando open editor, que te levará a um novo editor sql com o código gerado escrito. Você pode alterar e executar com ctrl + enter normalmente.
Um fluxo bem produtivo é criar a tabela via interface gráfica e depois editar os ajustes finos.
O DBEaver cuidará de oferecer opções compatíveis de acordo com o tipo de banco de dados a ser utilizado.
Conclusão
Esperamos que sua produtividade possa aumentar ao utilizar o DBEaver para auxiliar em operações com bancos de dados.
Agradecemos em primeiro lugar a Deus e depois aos leitores que tiveram o interesse em chegar até o fim deste artigo.
Boas consultas!
© Copyright BlindTec 2024 - 2026, todos os direitos reservados.Para mais detalhes, consulte a página de direitos autorais do portal.