Aplicações Cliente/Servidor são em sua maioria as preferidas pelos programadores, poderosos banco de dados como Oracle e SQL Server são utilizados, porém a instalação de um sistema desses necessita de completa assistência do suporte da empresa proprietária do sistema, o sistemas as vezes são aplicações simples, que para não ser necessário “reinventar a roda”, ou seja criar um novo banco de dados para um única aplicação (apesar de muitas empresas grandes fazerem isso), utilizar um banco de dados Cliente/Servidor, já que um banco de dados como o Access para ser distribuído com a aplicação apresenta serio problemas quando tem uma grande quantidade de dados, eis que surge um pequeno banco de dados open source, o SQLite.
Ganhador do premio Google O’Reilly 2005 Open Source Awards Winner!, o SQLite tem subido muito no conceito dos programadores, ele gera um banco de dados que pode ser entregue junto com a aplicação, excelente para aplicações pequenas que com um instalador do tipo NNF (Next, Next, Finish), instala perfeitamente um sistema simples., sem as complicações da instalação de um cliente/servidor.
O SQLite, é escrito em C, e utilizada um classe sem configuração alguma de SQL (SQL Puro) 92, porém nem todas as funções estão configuradas no SQLite. O SQLite não possui licença alguma, ele totalmente disponibilizado pelos autores, a Hwaki, ou seja, qualquer pessoa pode baixar as fontes no site, compilar, modificar, executar, utilizar, sem problema algum, porém o site do SQLite ressalta que alguns usuários devem adquirir uma permissão para usar o SQLite:
- Caso use em instituições não-publicas.
- Usar em instituições que não reconhecem o autor.
- Deve publicar a licença em lugar visível para os usuários.
- Seu departamento legal lhe disser que tem que adquirir a licensa.
Salvo essas condições o SQLite é totalmente livre para ser usado. O SQLite tem algumas restrições quanto ao SQL92, as principais ausências podem ser vistas abaixo:
- Instrução DELETE em múltiplas tabelas.
- Suporte a FOREIGN KEY.
- Suporte a Triggers
- Suporte Completo ao ALTER TABLE (Somente algumas funcionalidades estão implementadas)
- Ausência do RIGHT JOIN e FULL OUTER JOIN.
- GRANT e REVOKE
Esses são alguns das principais ausências nos comandos SQL, vendo o site citado a cima encontra-se a lista completa.
Manipulando o Banco de Dados
Chega de historio do SQLite e vamos a um exemplo prático de como utilizado, a versão utilizada é a 3.5.0, a versão atual é a 3.5.2, eu desenvolvi em Windows, mas o SQLite tem distribuição para Linux também. Vou levar em consideração que o arquivo já foi baixado e descompactado no seu computador.
Vamos abrir um prompt de comando e navegar com códigos de DOS ate a pasta onde se encontra o sqlite3.exe (lembrete, o 3 é da versão, se sua versão for outra pode ser diferente o nome do executável), vamos criar um banco de dados, essa linha no prompt seria equivalente a instrução SQL de CREATE DATABASE.
Sqlite3 teste.db
Execute essa linha no prompt e pronto, foi criado seu banco de dados, vá pelo Windows Explorer até a pasta e veja que lá há não há um arquivo chamado teste.db, o arquivo será criado quando for digitada a primeira instrução SQL no prompt, o mesmo comando que cria o banco é utilizado para editá-lo, como você pode perceber o prompt mudou do diretório C:/sqlite> por exemplo, para sqlite3>, agora podemos editar e inserir tabelas na nossa base de dados.
Eu criei um arquivo .bat para facilitar a edição de uma base de dados um arquivo .bat contem instruções do prompt para acessar algum arquivo. Criar esse arquivo facilita muito a edição dos bancos em SQLite, vou dar um exemplo, digamos que o banco fique na pasta Data da sua aplicação, criando um novo documento de texto e colocando a instrução acima utilizada para criar a base e salvando na mesma pasta do banco com extensão .bat, toda vez que você for utilizar o banco você executa esse .bat.
Vamos agora criar uma tabela simples, com a instrução abaixo:
CREATE TABLE Test(
Id int NOT NULL,
Nome varchar(80)
PRIMARY KEY(Id)
);
Como você pode ver ele não retorna nenhum valor a tela, para saber algumas funções especiais do SQLite basta digitar no prompt .help, e ele retorna todas as opções do SQLite, vamos agora ver como ficou nossa tabela, digite no prompt .schema test, e ai está toda a instrução SQL que compõe nossa tabela.
Agora vá até o Windows Explorer, e navegue ate a pasta do SQLite, e veja o arquivo teste.db, esse arquivo é o arquivo que será distribuído com a aplicação. Agora vamos inserir alguns valores na nossa tabela, a versão 3.5.0 não suporta o AUTO_INCREMENT, uma solução que o SQLite.org indica é a criação de seqüências, mas não vamos abordar isso aqui.
Execute as linhas de INSERT abaixo para fazermos alguns teste.
INSERT INTO Test VALUES(1, ‘Joao’);
INSERT INTO Test VALUES(2, ‘Maria’);
INSERT INTO Test VALUES(3, ‘Manuel’);
Após a inserção execute um SELECT * FROM Test;
E os 3 registros estão na tabela, vamos fazer uma ligação com FOREIGN KEY, apesar de não implementada corretamente, o SQLite aceita a sintaxe, muita gente confunde a função da FOREIGN KEY, ela não serve para vincular duas tabelas, ela é uma chave que garante integridade dos dados, garante que o registro inserido num tabela que é a FOREIGN KEY, exista em outra tabela. Porém o SQLite ainda não da suporte perfeito a esse instrução.
Vamos partir para outra situação, utilizando o mesmo banco o teste.db, um pequeno cliente gostaria de uma aplicação simples onde cadastrasse seus funcionários e seus cargos e conseguisse um relatório dos funcionários que ganham mais que a faixa do cargo.
Vamos criar uma tabela de Cargos(Cargos) com a seguinte sintaxe:
CREATE TABLE Cargos(
CargoId int NOT NULL,
CargoNm varchar(80),
Min_Sal Numeric(10,2),
Max_Sal Numeric(10,2),
PRIMARY KEY (CargoId)
);
Para ver se a tabela foi criada com sucesso utilize o comando do SQLite .schema Cargos. Vamos a tabela de Funcionários(Func), que possui um chave primaria composta ou seja cada cargo vai ter uma contagem de funcionários em sua chave primária:
CREATE TABLE Func(
FuncId INT NOT NULL,
CargoId INT NOT NULL,
FuncNm varchar(80),
Sal NUMERIC(10,2),
PRIMARY KEY(FuncId, CargoId),
FOREIGN KEY (CargoId) REFERENCES Cargos(CargoId)
);
Pronto temos as duas tabelas criadas, agora vamos fazer alguns INSERTs:
Cargos
Ø INSERT INTO Cargos VALUES(1, ‘Gerente’, 1000, 3000);
Ø INSERT INTO Cargos VALUES(2, ‘Secretaria’, 500, 800);
Ø INSERT INTO Cargos VALUES(3, ‘Office Boy’, 300, 490);
Func
Ø INSERT INTO Func VALUES(1, 1, ‘Carlos’, 2750);
Ø INSERT INTO Func VALUES(1, 2, ‘Maria’, 825);
Ø INSERT INTO Func VALUES(1, 3, ‘Joao’, 420);
Ø INSERT INTO Func VALUES(2, 3, ‘Miguel’, 500);
Agora vamos gerar o relatório de funcionários que recebem mais que seu salário, para isso utilizaremos o JOIN nas tabelas e conseguiremos fazer um relatório simples, veja a instrução SQL Abaixo:
SELECT f.FuncNm, c.CargoNm, f.Sal, c.Max_Sal
FROM Func f
JOIN Cargos c ON (c.CargoId = f.CargoId);
Temos um relatório assim de todos os funcionários, porém não foi isso o solicitado, para atender ao pedido basta simplesmente acrescentar a clausula WHERE, e deixar a instrução da seguinte maneira:
SELECT f.FuncNm, c.CargoNm, f.Sal, c.Max_Sal
FROM Func f
JOIN Cargos c ON (c.CargoId = f.CargoId)
WHERE f.Sal > c.Max_Sal;
E pronto, aí está, temos nosso enorme banco de dados com 7KB, segundo meu Windows Explorer, o cliente nem vai sentir o banco rodando, pois ele não é um serviço é um arquivo. Como podem ver, o SQLite é bem simples e de fácil uso e ao que tudo indica é um pequeno banco de dados que tem tudo para evoluir e se tornar um grande banco de dados.
Vale lembrar que a DLL Sqlite3.dll que está disponível para download no site do SQLite, é fundamental para o desenvolvimento de aplicações com ela, seja em Delphi, Java, etc., façam bom uso desse pequeno notável.