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:

  1. Instrução DELETE em múltiplas tabelas.
  2. Suporte a FOREIGN KEY.
  3. Suporte a Triggers
  4. Suporte Completo ao ALTER TABLE (Somente algumas funcionalidades estão implementadas)
  5. Ausência do RIGHT JOIN e FULL OUTER JOIN.
  6. 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.