Tutorial MySQL – Prisma

mysql

 

 

 

 

Este será um how-to (guia) básico para demonstrar o uso do banco de dados servidor MySQL em Prisma.

Pré-requisitos:

  • Prisma-1.0.99 ou superior.
  • Servidor Xampp instalado e MySQL configurado.

Links:

Instalando Xampp no Windows:

https://linguagemprisma.br4.biz/blog/instalando-xampp-no-windows/

Configurando MySQL no Win.:

https://linguagemprisma.br4.biz/blog/configurando-mysql-xampp-em-windows/

Instalando Xampp no Linux:

https://linguagemprisma.br4.biz/blog/instalando-servidor-xampp/

Configurando Acesso Remoto no Linux: clique aqui


Sobre o Banco de dados:

Para você que é novato no assunto e está se perguntando: o que é um banco de dados (o que é MySQL?)?

Você deveria se perguntar: para que serve?

(Pule esta parte se já souber)

BD (banco de dados) é um arquivo que armazena dados. Quando dizemos MySQL, SQlite3 ou Postgre etc. Estamos nos referindo ao programa ou biblioteca que tem as funções necessárias para criar e manipular o arquivo do banco de dados.

Um banco de dados, por exemplo, pode armazenar clientes, produtos, telefones, etc. Muito útil em programas de lojas, Mercados, etc.

Se você ainda quer mais detalhes sobre BD, dê uma breve volta pelo Gloogle.

 

Começando a programar:

 


1 – Obtendo a versão:

Crie um arquivo prisma chamado versao.prisma em uma pasta específica para este tutorial. (Dê preferência aos editores Geany ou Prismacod);

Saída:

informacao cliente mysql:    5.5.54
versao desta lib:    mysql para Prisma mysql-0.1

Nesta linha a biblioteca mysql Prisma é importada, com isso podemos usar suas funções.

Bem, a função imprima vocês já conhecem, então vamos para essa acima. Ela retorna uma string com o número da versão do cliente MySQL, não é a versão da biblioteca Prisma!

Acima temos uma variável reservada string com a descrição da versão da lib Prisma.

 


2 – Conexão com o servidor MySQL e abertura do banco de dados:

Salve como criabd.prisma

 

Incluindo a biblioteca mysql.

Prisma 1.0.99 traz o conceito de função principal, a função com este nome será chamada automaticamente pelo interpretador, é como o main() do C. Lembre-se de fechar no final com o respectivo ‘fim’.

Esta é uma variável com o local (ip) do servidor MySQL.

‘localhost’ indica que o servidor está instalado no mesmo computador que o programa sendo executado. Se o MySQL estiver instalado em outro computador na rede, basta usar o número ip dele entre aspas, ex.: local host = ‘192.168.1.100’;

Acima temos o usuário e senha do MySQL.

Esta linha acima indica o caminho do arquivo socket unix, não é necessário no Windows, pode deixar como nulo. Caso você tenha instalado o Servidor que não seja o Xampp, procure na documentação o local do arquivo na sua instalação.

 

Esta é a função de conexão com o MySQL,

Parâmetros:

host: o ip do servidor ou ‘localhost’ se estiver na mesma máquina do Xampp servidor MySQL;

user: usuário (‘root’ ou outro criado por você – );

senha: ‘senha’ do MySQL;

Bd: arquivo ‘banco de dados’ ou nulo se você quiser abrir mais tarde. Ex.: ‘teste.db’;

Porta: porta do servidor MySQL. (geralmente é 3306), ou nulo se estiver em ‘localhost’

socket: é o path completo do arquivo socket unix, só é usado quando estiver em localhost, caso contrario deixe nulo.

Ainda temos o último parâmetro que foi omitido no exemplo, este parâmetro é um item de configuração (flag) da conexão.

Usaremos mais a frente quando precisarmos.

Retornos:

conexao: é o objeto MySQL com a conexão e métodos do banco de dados.

err : é o erro retornado. Nulo se não tiver erro.


 

Nesta linha começa o tratamento de erro, caso o valor da variável err não seja nulo então significa que algum erro aconteceu e sua descrição estará nela em forma de string.

Caso haja erro, esse comando acima é executado:

É impresso o erro na tela, a conexão é fechada, e o programa é fechado com saída 1;

Mas se não houver erro podemos prosseguir com o seguinte comando:

Senão tiver erro, é executado um comando SQL,

CREATE DATABASE testedb;

Significa: crie um banco de dados chamado testedb.

Parâmetros:

String com comando MySQL.

Retorno:

err: string descrevendo o erro, ou nulo se não houver erro.


 

Se a execução da cláusula SQL falhar, o erro retornado é impresso na tela e o programa é fechado com saída 1;

Obs.: O comando prisma ‘leia()’ serve para o programa aguardar o usuário pressionar enter, assim dá tempo de ler a mensagem de erro se houver.

Obs. Você deve ter notado que nunca uso a variável erro e sim err, pois erro já existe em prisma e é uma função, lembra?!


 

Se o comando SQL for executado com sucesso é impresso a frase de sucesso na tela!

os blocos se,senaose, são todos fechados com o respectivo “fim”;

Obs. Tome cuidado, um fim a mais, ou faltando gera erro.


 

No final do programa, nunca se esqueça de fechar a conexão aberta com o comando acima.

Ao usar a função principal() em prisma sempre retorne 0 no final, ok!

 

3 – Criando tabela e inserindo dados:

Salve como inserebd.prisma

Detalhes:

Note a múltipla atribuição de variáveis em prisma! Para cada variável separada por vírgula antes do igual temos um respectivo valor separado por vírgula depois do igual.

Note também que desta vez usamos o quarto parâmetro nome do banco de dados: testedb. Com isso a conexão é criada já com esse banco de dados aberto para manipularmos!

Essa primeira parte você já sabe, passemos adiante.

A função tem_erro() está desenvolvida no final do programa após a função principal(); isso só é possível quando usamos a função padrão principal();  Veja-a:

Ela pega a conexão e variável err se encarregando de verificar se há um erro e caso haja fecha a conexao, imprime o erro e sai do programa.

Caso não haja erro ela não faz nada.


Este comando acima executa uma cláusula SQL, que significa:

APAGUE TABELA Carros SE EXISTIR

Parâmetro: String de comandos MySQL;

retorno:

err: string de erro, ou nulo se não houver erros na execução.


 

Novamente o tratamento de erros.


 

Acima criamos uma tabela chamada Carros com parâmetros MySQL. O comando significa:

CRIE TABELA Carros com as colunas Id do tipo Inteiro, Coluna Nome do tipo Texto, Preco do tipo Inteiro.

E assim é criada uma tabela no banco de dados testedb com três colunas.

Note que desta vez usamos conexao:execute ao invés de conexao:exec, use a forma que preferir pois as duas fazem a mesma coisa!

O retorno é a variável de erro e é feito o tratamento de erro novamente com a função tem_erro();


 

Depois de criar o banco de dados, criar a tabela Carros, podemos começar a colocar dados nessa tabela:

O comando acima é aquele que executa uma cláusula MySQL, lembra?

Parâmetro:

String de comando MySQL que significa:

INSIRA EM Carros VALORES: 1, ‘Audi’, 52642. Na mesma ordem das colunas criadas anteriormente.

Retorno:

err: igual ao anterior, a variável de erro.

Após a execução é feito o tratamento de erro com a função tem_erro();


 

Bem, os outros comandos são exatamente igual a este de cima, todos inserem dados.

E no final temos:

Imprime a frase de sucesso, pois chegou até aqui sem erros.

fecha a conexão com o comando conexao:feche();

e retorna 0 finalizando o programa!


4 – Lendo todos os dados da tabela

Salve com lendo_bd.prisma

terminal_ex4

Detalhes:

O trecho acima inclua a biblioteca mysql Prisma e inicia a função principal();

Nos comandos acima iniciamos a conexão com o servidor MySQL e tratamos do erro com a função tem_erro() igual ao exemplo anterior. Como já vimos esse código antes, não entrarei em detalhes.

Executamos acima o comando MySQL ‘SELECT * FROM Carros’ que significa:

SELECIONE TODAS AS COLUNAS (*) da tabela Carros.

Note que ao invés dos dois-pontos eu usei “->” para acessar o método exec. Isso é possível na versão Prisma-1.0.99 ou superior. Você escolhe, se preferir use ‘:’ ou ‘->’ para acessar métodos de tabelas.

Parâmetro: string de comando MySQL

retorno: string de erro, ou nulo se não houver erro.

Após a execução é feito o tratamento de erro com a função tem_erro();

Dicas:

Se você quisesse obter apenas uma linha específica adicione WHERE col = valor no fim do comando MySQL, ex.:

No caso acima, teríamos apenas a linha 3 selecionada.

Acima, seriam selecionadas todas as colunas onde Nome for igual a Audi.

Já aqui teriamos as linhas onde Id for maior que 2 e menor que 5, ou seja, linhas 3 e 4;


 

A primeira função acima pega o resultado obtido da execução da cláusula MySQL.

Parâmetros: vazio.

retornos:

resultado: objeto que contém o resultado da execução MySQL.

err: string de erro, ou nulo se não houver erro.


 

Acima temos uma função útil para sabermos automaticamente o número de campos da tabela, ou seja, quantas colunas ela tem.


Criamos a variavel lin (linha), imprimimos os nomes das colunas.

E iniciamos o laço de repetição enquanto que irá percorrer e ler cada linha de dado da tabela MySQL.


 

Lendo a linha da tabela, cada vez que essa função (resultado->obt_linha();) é repetida ela percorre uma linha da tabela do banco de dados, retornando nulo após chegar ao fim.

Obs. Ela percorre todas as linhas obtidas pelo comando SELECT, então se você selecionar apenas uma linha com o SELECT só será possível ler uma linha.

Como selecionamos todas as linhas da tabela, teremos vários resultados.

Parâmetros: vazio.

Retorno:

lin: tabela contendo informações do resultado lido no comando exec();

Essa tabela contêm os valores, igual ao número de colunas:

lin[1] = valor_da_coluna1,

lin[2] = valor_da_coluna2,

lin[3] = valor_da_coluna3.

De cada linha lida, é claro!

Obs. Se tivéssemos criado uma tabela com 4 colunas teríamos lin[4]!


se linha for válida (diferente de nulo ou falso) podemos usar seus valores, imprimindo-os todos com o comando para:

para i que é 1 até o número de colunas, imprima as linhas. fim

o poe” é para pular uma linha na tela do terminal ou cmd.


 

Caso o retorno de lin seja nulo (não existe mais linhas a serem lidas), o laço de repetição enquanto é interrompido com o comando quebre;


 

Saindo do laço enquanto:

Fechamos o objeto resultado com a função ->feche();

Fechamos o objeto de conexão con;

retornamos 0 e finalizamos a função principal() com seu respectivo fim!


5 – Lendo o número do último id inserido

Salve como ultimo_id.prisma

terminal_ex5

Detalhes:

Atenção vou pular comandos já explicados anteriormente, vamos direto ao que interessa.

Executando um comando MySQL e tratando do erro. Lembre-se que esse comando acima apaga a tabela se ela já existir;

Criamos a variável que contém a string de comandos MySQL, e depois a executamos com o con:exec();

Veja que criamos a tabela com a coluna Id int chave primária de auto incremento, é necessário este comando MySQL para pegarmos o valor do último Id inserido.

O comando SQL acima significa:

CRIE TABELA Filosofos com: coluna Id do tipo Inteiro Chave primária de auto incremento, coluna Name do tipo Texto.

Após isso é feito o tratamento de erro com a função tem_erro() que agora possui uma novidade: o terceiro parâmetro como mensagem de sucesso.


 

Acima inserimos os dados na tabela Filosofos, veja que escolhemos as colunas deixando Id de fora pois ela é uma chave de auto incremento (adiciona 1 a cada inserção);

Escolhemos que coluna inserir através do uso de parênteses.

INSIRA EM Filosofos (na coluna Name) VALORES(‘Socrates’);

Se houvesse mais colunas bastaria separá-las por vírgulas entre os parênteses, veja um exemplo:

Como os comandos posteriores ao de cima são iguais, apenas inserem novos dados na tabela, passemos aos útlimos comandos:


Enfim, para pegar o último Id inserido use esta função acima:

con:ultimo_id();

Parâmetros: vazio;

Retornos: número prisma representando o valor do último id;

Por fim fechamos a conexão e finalizamos o programa:


A esta altura você já deve estar se questionando: como faço para inserir dados dinamicamente em tempo de execução usando variáveis.

A resposta é mais simples do que você imagina: lembra do operador de unir strings .. , pois é, use-o. Lembra da função string.formate(), use-a também.

Ex.:

Usando string.formate();

Usando operador de união de strings:

É claro que os códigos acima não tem nenhum tratamento de erro com os parâmetros recebidos, imagine se ‘con’ ou outro parâmetro fosse nulo! Geraria um erro fatal.

Você mesmo pode fazer o tratamento de erro, o código é simples:

se con == nulo entao retorne nulo fim; e assim com os demais parâmetros.

 

6 – Obtendo o nome das colunas

 

As vezes você não saberá quais colunas tem uma tabela em um banco de dados. Para descobrir os nomes basta usar um comando específico do MySQL:

local col = resultado->obt_coluna();

Veja um exemplo completo de uso:

Salve como nome_col.prisma

 

Detalhes:

Vamos pular o que já foi explicado, a novidade aqui é:

Executa a string de comando MySQL:

Seleciona tudo da tabela Carros com o limite de 3 linhas.

Acima usamos a função para obter o resultado da execução do comando MySQL.

Aqui em cima pegamos os nomes das colunas existentes na tabela Carros. O retorne é uma tabela.

Esta tabela contém índices e cada um deles contém o nome da coluna.

Ex.:

col[1] = ‘nome coluna1’;

col[2] = ‘nome coluna2’;

etc.

O número de elementos da tabela corresponde ao número de colunas existentes, portanto podemos saber este número usando o operador de tamanho: num_col = #col;

Acima usamos um laço de repetição ‘para’ e imprimimos cada elemento da tabela ‘col’ correspondente ao nome de cada coluna.

Abaixo fazemos o mesmo com as linhas (já foi explicado nos exemplos anteriores!)

Com cuidado fechamos os objetos abertos e finalizamos retornando 0 ao sistema operacional:


 

7 – Executando múltiplos comandos MySQL

Caso você queira é possível executar de uma só vez múltiplos comandos, veja abaixo o exemplo:

Salve como multi_cmd.prisma

 

Detalhes:

A novidade é o uso da seguinte variável:

Significa Cliente multiplos comandos.

Esta variável é passada como o último parâmetro para a função de conexão, ela é um flag que muda a configuração da conexão neste caso faz com que a conexão com o servidor aceite múltiplos comandos em uma única string.

Veja a função de conexão:


A função acima executa a seguinte string MySQL:

Na string acima selecionamos várias linhas com Id igual a 2, 3 e 6.

Múltiplos comandos geram múltiplos resultados.

Para percorrer todos os resultados iniciamos um laço enquanto cujo teste condicional é status == 0;. A variável status é usada para testar se há mais resultados ou não, o retorno deve sempre ser zero ou outro número quando não houver mais retornos de resultados.

Acima obtemos o primeiro resultado do laço enquanto.

Neste trecho obtemos a lin (ou nulo caso não haja linha no retorno);

Testa se lin é uma linha válida e se status indica resultado válido.

Caso lin seja válida e status zero, podemos ler imprimir a linha. Neste caso apenas o valor da coluna 1;

O poe” é para pular uma linha no terminal ou cmd.

Devemos fechar o resultado para pegarmos o próximo!

A função acima passa para o próximo resultado. Se status for igual a zero então temos um novo resultado válido, bastando usar novamente a função con:obt_resultado() para reiniciar o processo, isso é feito com o laço de repetição ‘enquanto’;

status = conexao:proximo();

Parâmetro: vazio;

Retornos:

1 – status: número que indica sucesso se for igual a zero ou erro (não há mais resultados) se for maior que zero.


 

Acima temos o teste para continuar ou interromper o laço ‘enquanto’;

Detalhe aqui para a função erro() do MySQL:

Retorna uma string descrevendo o último erro se houver.

Após isso finalizamos a função principal() retornando zero ao sistema operacional.

Abaixo temos a implementação da função que trata dos erros:


8 – Colocando uma imagem no banco de dados

A lógica é abrir a imagem em modo binario, ler todo o conteúdo, codificá-la para evitar erros de caracteres especiais e inseri-la em uma tabela do MySQL.

Vamos ao código:

Salve como insere_img.prisma

 

Detalhes:

Neste ponto abrimos o arquivo da imagem em modo leitura binária usando funções da biblioteca de entrada e saída ‘es’. (troque img.jpg pelo nome de sua imagem alvo.)

Verificamos se a imagem foi aberta, caso sim, lemos o todo o conteúdo e fechamos o objeto do arquivo aberto, caso contrário (senao) uma mensagem de erro é impressa finalizando o programa.

Após criar as variáveis fazemos a conexão;

Antes de inserirmos string da imagem lida, devemos codificá-la para não dar erro de caracteres. Usamos para isso a função string.base64() que recebe uma string e retorna sua codificação em base 64.

 

Na função acima criamos a string comando para inserir a imagem no banco de dados. Para colocar a string da imagem dentro da string de comandos MySQL usamos a função string.formate() em que o %s é substituído pelo segundo parâmetro. Você poderia facilmente, também, usar os operadores de união de strings para uni-las (os ‘..’);

Apagamos a tabela caso ela exista.

Criamos a tabela Filosofos com duas colunas, a primeira ‘Id’ como chave de auto-incremento, e a segunda ‘Name’ tipo TEXT.

Enfim, inserimos o dado com a função acima, lembre-se que sql_cmd foi criada mais acima com a string da imagem.

Por fim, fechamos a conexão e retornamos 0 da função principal() para o sistema operacional.


9 – Lendo a imagem inserida no banco de dados

Não teria sentido inserir uma imagem no banco de dados se não fosse possível obtê-la posteriormente, é isso o que vamos fazer neste exemplo.

Obtendo a imagem inserida conforme o exemplo anterior.

Salve como lendo_img.prisma

 

Detalhes:

Vamos à novidade

Aqui selecionamos a coluna Id 10 onde inserimos a imagem.

Obs. Poderíamos criar uma tabela mais completa com campo Nome_imagem = ‘imagem1.jpj” ; Mas como é um exemplo simplificado deixemos com está.

Obtendo o objeto resultado da execução MySQL.

Obtendo o valor da linha selecionada.

Se lin for uma linha válida entao abrimos um arquivo em modo escrita binária e escrevemos dentro dele o valor de lin[1]. Antes, é claro, fazemos a decodificação base64 com a função string.dec_base64(). Esta função recebe uma string em codificação base64 e retorna seu valor decodificado.

O restante é igual aos exemplos anteriores e já foi explicado!


10 – Deletando valores da tabela do banco de dados

 

Salve como deleta.prisma

 

Detalhes:

Essa é a string de comando MySQL que significa:

DELETE de Carros o valor onde id é igual a 1;

E executamos a string após abrir devidamente o banco de dados.

Não se esqueça de fechar os objetos no fim do programa.

Obs.: note que não usamos a função principal() aqui, se quiser não precisa usá-la.


11 – Atualizando os dados de uma tabela

Imagine que você queira modificar um valor já existente no banco de dados, é o que faz o exemplo abaixo:

Salve como atualiza.prisma

Detalhes:

Essa é a string comando MySQL, leia da seguinte forma:

ATUALIZE Carros defina Nome = ‘NADA_AQUI’, Preco = 0 onde Id for igual a 2;

Ou seja, na linha com Id 2, as colunas Nome e Preco mudarão de valor.

Aqui em cima, executamos o comando de atualização do bd.

Nos comandos posteriores fazemos a leitura para ver o dado modificado, isso já foi explicado nos exemplos anteriores.

Obs.: como você pode ter percebido, é possível optar por não usar o estilo orientado a objeto passando explicitamente os objetos como parâmetro:

mysql.exec(con,sql_str); ao invés de con:exec(sql_str);


12 – Obtendo o nome das tabelas existentes em um banco de dados

 

Neste próximo exemplo demonstro como descobrir automaticamente o nome das tabelas de um bd.

Salve como nome_tab.prisma

Detalhes:

Não tem muito segredo, basta executar a string MySQL “SHOW TABLES” e depois pegar o resultado.

Executando a string MySQL, depois de ter aberto devidamente o banco de dados.

Obtendo o objeto resultado na variável res.

O laço ‘enquanto’ acima lê cada nome de tabela que houver.

 

13 – Excluindo tabelas do banco de dados

 

Salve como apaga_tab.prisma

Detalhes:

O comando para apagar a tabela é:

“APAGUE TABELA Carros SE EXISTIR;

Obs.: logicamente o usuário deve ter privilégios para deletar a tabela.


 

14 – Excluindo banco de dados

 

Necessário privilégios ao usuário.

Salve como deleta_bd.prisma

Detalhes:

“APAGUE BANCO_DE_DADOS testedb SE EXISTIR”

Exclui o banco de dados testedb.


15 – Limpando o Banco de Dados

 

Salve como limpa_bd.prisma

Detalhes:

A ideia básica é listar os nomes de todas as tabelas e depois apagá-las uma a uma usando um laço.

Aqui executamos a string que lista cada nome de tabela existente no banco de dados. Para pegar os valores devemos obter o objeto resultado:

Acima obtemos o objeto resultado na variável res.

Com esse laço enquanto pegamos cada linha na variável lin e no laço ‘para’ interno pegamos os nomes de cada tabela e para cada nome executamos o comando que apaga tabelas:

Esse comando acima deleta as tabelas se existirem.

Obs.: é bom colocar o comando IF EXISTS pois se a tabela não existir e tentarmos apagá-la gera um erro fatal, e esse IF evita isso.


16 – Listando os nomes dos bancos de dados no servidor MySQL

Necessita privilégios de usuário root

Salve como lista_bd.prisma

Detalhes:

String comando MySQL que lista todos os bancos de dados.

Depois da execução, obtemos o objeto resultado na variável res.

Com o laço ‘enquanto’ percorremos todos os resultados o imprimimos os valores.


17 – Contando o número de linhas de uma tabela

 

Há uma maneira rápida e fácil de contar linhas de uma tabela de banco de dados MySQL.

Salve como num_lin.prisma

Detalhes:

Este comando conta o número de linhas inseridas em Carros.

Obs. Note que o comando MySQL está em minúscula e a execução ocorre sem problemas.

Com o laço ‘enquanto’ pegamos o valor selecionado. Nem precisaríamos do laço visto que o retorno é um apenas com o valor número de linhas da tabela.


18 – Obtendo tipo de codificação de caracteres do MySQL

Salve como codi.prisma

 

Com essa função acima obtemos uma tabela com toda descrição da codificação.

E por meio comando ‘para’ exibimos cada elemento da coluna no terminal.


 

Chegamos ao final do tutorial. Espero que ele tenha sido muito útil.

Vou passar uns links sobre comandos MySQL como dica para quem quiser aprimorar seus conhecimentos:

https://www.todoespacoonline.com/w/2014/10/comandos-basicos-mysql/

http://www.univasf.edu.br/~leonardo.campos/Arquivos/Disciplinas/POO_2007_2/Apostilando_Tutorial_MySQL.pdf

 

FIM

 

 

 

Att. Adalberto