O ecossistema de bancos de dados evoluiu muito nos últimos anos. Recursos que antes dependiam exclusivamente da aplicação agora começam a ser executados diretamente dentro do banco de dados: integração HTTP, processamento de JSON, geração de UUIDs modernos e até inteligência artificial.
O VillageSQL adiciona novas capacidades ao MySQL, permitindo expandir o SQL tradicional com funcionalidades modernas normalmente encontradas em plataformas externas ou em bancos com ecossistemas mais extensíveis.
Neste artigo vamos demonstrar, na prática, como utilizar o VillageSQL para transformar o MySQL em uma plataforma capaz de:
- realizar chamadas HTTP diretamente via SQL;
- integrar modelos de IA generativa localmente com Ollama;
- gerar respostas usando LLMs dentro do banco;
- trabalhar com UUID v7;
- ampliar as possibilidades de automação e integração para DBAs e desenvolvedores.
O que será demonstrado
Durante o laboratório construiremos um ambiente completo utilizando Docker com:
| Componente | Objetivo |
|---|---|
| MySQL | Banco de dados principal |
| VillageSQL | Extensões modernas para SQL |
| Ollama | Execução local de modelos de IA |
| phi3:mini | Modelo LLM leve e rápido |
Ao final do artigo teremos um MySQL capaz de:
Executar HTTP diretamente via SQL
|
1 |
SELECT http_get('https://httpbin.org/get'); |
Consumir IA generativa dentro do banco
|
1 2 3 4 5 6 |
CALL ollama_prompt( 'Explique o que é MySQL Group Replication', @r ); SELECT @r; |
Executar análises inteligentes usando SQL
Exemplo de análise de sentimento:
|
1 2 3 |
SELECT sentimento_llama( 'O serviço foi excelente e muito rápido' ); |
Trabalhar com UUID v7
UUID v7 traz vantagens importantes para bancos relacionais modernos:
- melhor ordenação temporal;
- menor fragmentação de índices;
- melhor performance em INSERTs;
- identificadores modernos para arquiteturas distribuídas.
Estrutura interna
| UUID | Estrutura | Observação |
|---|---|---|
| v4 (aleatório) | aleatório | rand | v=4 | rand | aleatório | 128 bits totalmente aleatórios → hot spots em índice B-Tree |
| v7 (timestamp) | timestamp 48b | v=7 | rand | rand | aleatório | 48 bits = Unix epoch em ms → INSERTs sempre no final do índice |
Hands-on
Subindo os ambientes em docker e conferindo o funcionamento
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
git clone https://github.com/marcio28costa/villagesql_lab cd villagesql_lab docker compose up -d [+] Running 5/5 ✔ Network villagesql_lab_labnet Created 0.4s ✔ Volume "villagesql_lab_villagesql_data" Created 0.0s ✔ Volume "villagesql_lab_ollama_data" Created 0.0s ✔ Container villagesql Created 0.1s ✔ Container ollama Created 0.1s docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 24ae67bc837f ollama/ollama:latest "/bin/ollama serve" 36 seconds ago Exited (0) 9 seconds ago ollama fa3e64811d1e villagesql/server:stable "docker-entrypoint.s…" 36 seconds ago Exited (0) 8 seconds ago villagesql |
Instalação das extensões e preparacao do ambiente no VillageSQL
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
docker exec -it villagesql mysql -uvillage -pvillage -A mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.4.8-villagesql-0.0.3 Source distribution Copyright (c) 2000, 2026, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> INSTALL EXTENSION vsql_uuid; Query OK, 0 rows affected (0.06 sec) mysql> INSTALL EXTENSION vsql_ai; Query OK, 0 rows affected (0.20 sec) mysql> INSTALL EXTENSION vsql_http; ERROR 3219 (HY000): VEB file not found: vsql_http.veb mysql> \q # Compilando a extensão vsql_http: docker exec -it villagesql bash apt-get update && apt-get install -y \ git cmake g++ libcurl4-openssl-dev pkg-config make docker exec -it villagesql mysql -uvillage -pvillage -A mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 8.4.8-villagesql-0.0.3 Source distribution Copyright (c) 2000, 2026, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> INSTALL EXTENSION vsql_http; Query OK, 0 rows affected (0.02 sec) |
Instalação e atualização do ollama, aplicando um modelo de consulta mais leve
|
1 2 3 4 5 6 7 8 9 10 |
docker exec -it ollama ollama pull phi3:mini pulling manifest pulling 633fc5be925f: 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 2.2 GB pulling fa8235e5b48f: 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.1 KB pulling 542b217f179c: 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 148 B pulling 8dde1baf1db0: 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 78 B pulling 23291dc44752: 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 483 B verifying sha256 digest writing manifest success |
Criando as procedures utilizadas para atualizar nossa tabela com uso de IA.
|
1 2 3 4 5 |
docker exec -i villagesql mysql -uvillage -pvillage village < procedures/ollama_prompt.sql docker exec -i villagesql mysql -uvillage -pvillage village < procedures/gemini_sentimento.sql docker exec -i villagesql mysql -uvillage -pvillage village < procedures/sentimento_llama.sql |
Agora vamos atualizar nossa tabela utilizando as procedures utilizanod o ollama e gemini.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
### nossas tabelas mysql> show tables; +-------------------+ | Tables_in_village | +-------------------+ | avaliacoes | | avaliacoes_gemini | | avaliacoes_llama | +-------------------+ 3 rows in set (0.02 sec) mysql> select * from avaliacoes_llama; +----+------------------+---------------------------------+------------+---------------------+ | id | produto | texto | sentimento | criado_em | +----+------------------+---------------------------------+------------+---------------------+ | 1 | Fone BT X200 | Chegou rapido, som excelente! | NULL | 2026-05-09 19:46:48 | | 2 | Tenis Runner Pro | Veio com defeito, decepcionante | NULL | 2026-05-09 19:46:48 | | 3 | Mochila Urbana | Qualidade razoavel pelo preco | NULL | 2026-05-09 19:46:48 | +----+------------------+---------------------------------+------------+---------------------+ 3 rows in set (0.02 sec) ### atualizacao com o ollama mysql> call prc_sentimento_llama(); +--------------------------------------------------+ | resultado | +--------------------------------------------------+ | ID 1 | Chegou rapido, som excelente! -> positivo | +--------------------------------------------------+ 1 row in set (9.11 sec) +----------------------------------------------------+ | resultado | +----------------------------------------------------+ | ID 2 | Veio com defeito, decepcionante -> negativo | +----------------------------------------------------+ 1 row in set (12.75 sec) +----------------------------------------------------+ | resultado | +----------------------------------------------------+ | ID 3 | Qualidade razoavel pelo preco -> indefinido | +----------------------------------------------------+ 1 row in set (1 min 50.33 sec) Query OK, 0 rows affected (1 min 50.34 sec) mysql> select * from avaliacoes_llama; +----+------------------+---------------------------------+------------+---------------------+ | id | produto | texto | sentimento | criado_em | +----+------------------+---------------------------------+------------+---------------------+ | 1 | Fone BT X200 | Chegou rapido, som excelente! | positivo | 2026-05-09 19:46:48 | | 2 | Tenis Runner Pro | Veio com defeito, decepcionante | negativo | 2026-05-09 19:46:48 | | 3 | Mochila Urbana | Qualidade razoavel pelo preco | indefinido | 2026-05-09 19:46:48 | +----+------------------+---------------------------------+------------+---------------------+ 3 rows in set (0.00 sec) mysql> select * from avaliacoes_gemini; +----+------------------+---------------------------------+------------+---------------------+ | id | produto | texto | sentimento | criado_em | +----+------------------+---------------------------------+------------+---------------------+ | 1 | Fone BT X200 | Chegou rapido, som excelente! | NULL | 2026-05-09 19:46:48 | | 2 | Tenis Runner Pro | Veio com defeito, decepcionante | NULL | 2026-05-09 19:46:48 | | 3 | Mochila Urbana | Qualidade razoavel pelo preco | NULL | 2026-05-09 19:46:48 | +----+------------------+---------------------------------+------------+---------------------+ 3 rows in set (0.01 sec) ### usando o gemini mysql> call prc_sentimento_gemini('Coloque_sua_chave_aqui'); +--------------------------------------------------+ | resultado | +--------------------------------------------------+ | ID 1 | Chegou rapido, som excelente! -> positivo | +--------------------------------------------------+ 1 row in set (1.83 sec) +----------------------------------------------------+ | resultado | +----------------------------------------------------+ | ID 2 | Veio com defeito, decepcionante -> negativo | +----------------------------------------------------+ 1 row in set (3.14 sec) +------------------------------------------------+ | resultado | +------------------------------------------------+ | ID 3 | Qualidade razoavel pelo preco -> neutro | +------------------------------------------------+ 1 row in set (5.90 sec) Query OK, 0 rows affected (5.90 sec) mysql> select * from avaliacoes_gemini; +----+------------------+---------------------------------+------------+---------------------+ | id | produto | texto | sentimento | criado_em | +----+------------------+---------------------------------+------------+---------------------+ | 1 | Fone BT X200 | Chegou rapido, som excelente! | positivo | 2026-05-09 19:46:48 | | 2 | Tenis Runner Pro | Veio com defeito, decepcionante | negativo | 2026-05-09 19:46:48 | | 3 | Mochila Urbana | Qualidade razoavel pelo preco | neutro | 2026-05-09 19:46:48 | +----+------------------+---------------------------------+------------+---------------------+ 3 rows in set (0.00 sec) |
Realizando qualquer consulta via banco de dados com uso da IA.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
## gemini mysql> SELECT ai_prompt( 'google', 'gemini-2.5-flash', 'sua_chave', 'me diga um numero de 1 a 10' )\G *************************** 1. row *************************** ai_prompt( 'google', 'gemini-2.5-flash', 'sua_chave', 'me diga um numero de 1 a 10' ): 7 1 row in set (1.15 sec) ## realizando a consulta no ollama via http e recebendo a resposta mysql> CALL ollama_prompt('Apenas diga um numero entre 1 a 10', @r); sQuery OK, 0 rows affected (3.85 sec) mysql> select @r; +------+ | @r | +------+ | 3 | +------+ 1 row in set (0.00 sec) |
Explorando a cryptografia no VillageSQL
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
docker exec -it villagesql mysql -uvillage -pvillage village -A INSTALL EXTENSION vsql_crypto; mysql> CREATE TABLE usuarios ( -> id UUID PRIMARY KEY, -> nome VARCHAR(100), -> email VARCHAR(100), -> cpf_hash VARCHAR(200), -- hash do CPF para busca -> senha TEXT -- hash da senha com PBKDF2 -> ); Query OK, 0 rows affected (0.06 sec) mysql> INSERT INTO usuarios (id, nome, email, cpf_hash, senha) VALUES -> (UUID_V7(), 'Joao Silva', '[email protected]', HEX(digest('123.456.789-00', 'sha256')), crypt('senha123', gen_salt('pbkdf2-sha256', 100000))), -> (UUID_V7(), 'Maria Souza', '[email protected]', HEX(digest('987.654.321-00', 'sha256')), crypt('maria@2026', gen_salt('pbkdf2-sha256', 100000))); Query OK, 2 rows affected (0.12 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT id, nome, email, cpf_hash, senha FROM usuarios\G *************************** 1. row *************************** id: 019e0e87-eb9a-7148-8c9b-ff82e9b9c9d2 nome: Joao Silva email: joao@email.com cpf_hash: F788964B0BA012D64AE6D4C20C698D86821B8FBE725E1748E0D9644F3CE9A1B7 senha: $pbkdf2-sha256$100000$FQqtJ7DUjySfIRaZg0KJCQ$lr60G8HPLei0yxuVyj6Cd8c/GhfUOWVERBfBoTMPPOs *************************** 2. row *************************** id: 019e0e87-ebd5-700a-a2ce-bfea9b10731b nome: Maria Souza email: maria@email.com cpf_hash: 22B9ABAD406A7473E4314CFE3A7F030E18988B8FA1F9164A03B5C617DB6CA9CA senha: $pbkdf2-sha256$100000$DHHHijkmdcWnFeiDSghJCg$sWlWX6dD5sv/5PEc5BVrSksHXCCA11zCMG8JToLS83s 2 rows in set (0.00 sec) mysql> SELECT nome, email -> FROM usuarios -> WHERE cpf_hash = HEX(digest('987.654.321-00', 'sha256')); +-------------+-----------------+ | nome | email | +-------------+-----------------+ | Maria Souza | maria@email.com | +-------------+-----------------+ 1 row in set (0.00 sec) mysql> -- Simular login correto Query OK, 0 rows affected (0.00 sec) mysql> SELECT nome, -> CASE WHEN crypt('senha123', senha) = senha -> THEN 'Login OK' -> ELSE 'Senha incorreta' -> END AS resultado +------------+-----------+ | nome | resultado | +------------+-----------+ | Joao Silva | Login OK | +------------+-----------+ 1 row in set (0.06 sec) mysql> -- Simular login errado Query OK, 0 rows affected (0.00 sec) mysql> SELECT nome, -> CASE WHEN crypt('senha_errada', senha) = senha -> THEN 'Login OK' -> ELSE 'Senha incorreta' -> END AS resultado +------------+-----------------+ | nome | resultado | +------------+-----------------+ | Joao Silva | Senha incorreta | +------------+-----------------+ 1 row in set (0.06 sec) |
Demonstrando o uso do UUID no VillageSQL
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
INSTALL EXTENSION vsql_uuid; mysql> CREATE TABLE produtos ( -> id UUID PRIMARY KEY, -> nome VARCHAR(100), -> preco DECIMAL(10,2) -> ); Query OK, 0 rows affected (0.02 sec) mysql> mysql> INSERT INTO produtos VALUES -> (UUID_V7(),'Produto A',10.0), -> (UUID_V7(),'Produto B',20.0); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT id, UUID_VERSION(id) FROM produtos; +--------------------------------------+------------------+ | id | UUID_VERSION(id) | +--------------------------------------+------------------+ | 019e0e8f-c280-7490-b310-b5c1dc9e038f | 7 | | 019e0e8f-c280-79b4-b36e-2ce91c271d00 | 7 | +--------------------------------------+------------------+ 2 rows in set (0.00 sec) |
O VillageSQL mostra uma nova forma de utilizar o MySQL, adicionando recursos modernos como chamadas HTTP diretamente via SQL, integração com modelos de IA generativa executados localmente com Ollama .
Neste laboratório demonstramos como o banco pode interagir com APIs, executar modelos LLM e automatizar análises e integrações sem depender totalmente da camada de aplicação.
Outro destaque importante é o UUID v7, que melhora significativamente a utilização de identificadores em bancos relacionais ao permitir ordenação temporal, reduzir fragmentação em índices B-Tree e aumentar a eficiência de INSERTs quando comparado ao UUID v4 tradicional, algo especialmente relevante em ambientes com grande volume de escrita.
Do ponto de vista técnico, o VillageSQL também evidencia uma tendência importante na evolução dos bancos de dados: aproximar processamento, integração e inteligência diretamente da camada SQL, reduzindo dependências externas e simplificando arquiteturas para determinados cenários.
Recursos como chamadas HTTP nativas, manipulação avançada de JSON e integração com IA local abrem espaço para novas possibilidades em automação, observabilidade, classificação de dados e enriquecimento de informações, utilizando o próprio MySQL como plataforma central de processamento.
Ambiente utilizado no laboratório: Oracle Linux 8.10 – 4 GB de memória RAM e Docker version 26.1.3





