Pesquisa de site

Um tutorial prático de SQLite3


Comece com este banco de dados incrivelmente poderoso e comum. Baixe a folha de dicas do SQLite.

Os aplicativos geralmente salvam dados. Quer seus usuários criem documentos de texto simples, layouts gráficos complexos, progresso de jogos ou uma lista complexa de clientes e números de pedidos, o software geralmente implica que os dados estão sendo gerados. Existem muitas maneiras de armazenar dados para uso repetido. Você pode despejar texto em formatos de configuração como INI, YAML, XML ou JSON, pode gravar dados binários brutos ou pode armazenar dados em um banco de dados estruturado. SQLite é um banco de dados leve e independente que facilita a criação, análise, consulta, modificação e transporte de dados.

[Baixe nossa folha de referências do SQLite3]

SQLite foi dedicado ao domínio público, o que tecnicamente significa que não é protegido por direitos autorais e, portanto, não requer licença. Caso necessite de uma licença, você pode adquirir uma garantia de título. SQLite é imensamente comum, com cerca de 1 trilhão de bancos de dados SQLite em uso ativo. Isso inclui vários bancos de dados em todos os dispositivos Android e iOS, em todos os computadores macOS e Windows 10, na maioria dos sistemas Linux, em todos os navegadores baseados em Webkit, em aparelhos de TV modernos, em sistemas multimídia automotivos e em inúmeros outros aplicativos de software.

Em resumo, é um sistema confiável e simples de usar para armazenar e organizar dados.

Instalando

Você provavelmente já possui bibliotecas SQLite em seu sistema, mas precisa das ferramentas de linha de comando instaladas para usá-las diretamente. No Linux, você provavelmente já possui essas ferramentas instaladas. O comando fornecido pelas ferramentas é sqlite3 (não apenas sqlite).

Se você não possui o SQLite instalado no Linux ou BSD, você pode instalá-lo a partir do seu repositório de software ou árvore de ports, ou baixá-lo e instalá-lo a partir do código-fonte ou como um binário compilado.

No macOS ou Windows, você pode baixar e instalar ferramentas SQLite em sqlite.org.

Usando SQLite

É comum interagir com um banco de dados através de uma linguagem de programação. Por esse motivo, existem interfaces SQLite (ou "bindings") para Java, Python, Lua, PHP, Ruby, C++ e muitos outros. No entanto, antes de usar essas bibliotecas, é útil entender o que realmente está acontecendo com o mecanismo de banco de dados e por que a escolha de um banco de dados é importante. Este artigo apresenta o SQLite e o comando sqlite3 para que você possa se familiarizar com os conceitos básicos de como esse banco de dados lida com dados.

Interagindo com SQLite

Você pode interagir com o SQLite usando o comando sqlite3. Este comando fornece um shell interativo para que você possa visualizar e atualizar seus bancos de dados.

$ sqlite3
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

O comando coloca você em um subshell SQLite e, portanto, seu prompt agora é um prompt SQLite. Seus comandos Bash habituais não funcionam aqui. Você deve usar comandos SQLite. Para ver uma lista de comandos SQLite, digite .help:

sqlite> .help
.archive ...             Manage SQL archives
.auth ON|OFF             Show authorizer callbacks
.backup ?DB? FILE        Backup DB (default "main") to FILE
.bail on|off             Stop after hitting an error.  Default OFF
.binary on|off           Turn binary output on or off.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
[...]

Alguns desses comandos são binários, enquanto outros requerem argumentos exclusivos (como nomes de arquivos, caminhos, etc.). Estes são comandos administrativos para o seu shell SQLite e não são consultas de banco de dados. Os bancos de dados recebem consultas em Structured Query Language (SQL), e muitas consultas SQLite são iguais às que você já conhece dos bancos de dados MySQL e MariaDB. No entanto, os tipos de dados e as funções são diferentes, portanto, preste muita atenção às pequenas diferenças se estiver familiarizado com outro banco de dados.

Criando um banco de dados

Ao iniciar o SQLite, você pode abrir um prompt na memória ou selecionar um banco de dados para abrir:

$ sqlite3 mydatabase.db

Se você ainda não possui banco de dados, você pode criar um no prompt do SQLite:

sqlite> .open mydatabase.db

Agora você tem um arquivo vazio em seu disco rígido, pronto para ser usado como banco de dados SQLite. A extensão do arquivo .db é arbitrária. Você também pode usar .sqlite ou o que quiser.

Criando uma tabela

Os bancos de dados contêm tabelas, que podem ser visualizadas como uma planilha. Há uma série de linhas (chamadas registros em um banco de dados) e colunas. A interseção de uma linha e uma coluna é chamada de campo.

A Linguagem de Consulta Estruturada (SQL) tem o nome do que fornece: Um método para consultar o conteúdo de um banco de dados em uma sintaxe previsível e consistente para receber resultados úteis. SQL se parece muito com uma frase comum em inglês, embora um pouco robótica. Atualmente, seu banco de dados está vazio, sem tabelas.

Você pode criar uma tabela com a consulta CREATE. É útil combinar isso com a instrução IF NOT EXISTS, que evita que o SQLite destrua uma tabela existente.

Você não pode criar uma tabela vazia no SQLite, portanto, antes de tentar uma instrução CREATE, você deve pensar sobre que tipo de dados você prevê que a tabela irá armazenar. Neste exemplo, criarei uma tabela chamada member com estas colunas:

  • Um identificador exclusivo
  • O nome de uma pessoa
  • A data e hora da entrada de dados

ID único

É sempre bom referir-se a um registro por um número único, e felizmente o SQLite reconhece isso e faz isso automaticamente para você em uma coluna chamada rowid.

Nenhuma instrução SQL é necessária para criar este campo.

Tipos de dados

Para minha tabela de exemplo, estou criando uma coluna name para armazenar dados TEXT. Para evitar que um registro seja criado sem dados em um campo especificado, você pode adicionar a diretiva NOT NULL.

O SQL para criar este campo é: nome TEXT NOT NULL

Existem cinco tipos de dados (na verdade classes de armazenamento) no SQLite:

  • TEXTO: uma sequência de texto
  • INTEIRO: um número inteiro
  • REAL: um número de ponto flutuante (casas decimais ilimitadas)
  • BLOB: dados binários (por exemplo, uma imagem .jpeg ou .webp)
  • NULL: um valor nulo

Carimbo de data e hora

SQLite inclui uma função conveniente de data e carimbo de data/hora. Não é um tipo de dados em si, mas uma função no SQLite que gera uma string ou um número inteiro, dependendo do formato desejado. Neste exemplo, deixei como padrão.

O SQL para criar este campo é: datestamp DATETIME DEFAULT CURRENT_TIMESTAMP

SQL de criação de tabela

O SQL completo para criar esta tabela de exemplo no SQLite:

sqlite> CREATE TABLE
...> IF NOT EXISTS
...> member (name TEXT NOT NULL,
...> datestamp DATETIME DEFAULT CURRENT_TIMESTAMP

Neste exemplo de código, pressionei Return após as cláusulas lógicas da instrução para facilitar a leitura. SQLite não executará seu comando a menos que termine com ponto e vírgula (;).

Você pode verificar se a tabela foi criada com o comando SQLite .tables:

sqlite> .tables
member

Ver todas as colunas de uma tabela

Você pode verificar quais colunas e linhas uma tabela contém com a instrução PRAGMA:

sqlite> PRAGMA table_info(member);
0|name|TEXT|1||0
1|datestamp|CURRENT_TIMESTAMP|0||0

Entrada de dados

Você pode preencher sua nova tabela com alguns dados de amostra usando a palavra-chave SQL INSERT:

> INSERT INTO member (name) VALUES ('Alice');
> INSERT INTO member (name) VALUES ('Bob');
> INSERT INTO member (name) VALUES ('Carol');
> INSERT INTO member (name) VALUES ('David');

Verifique os dados da tabela:

> SELECT * FROM member;
Alice|2020-12-15 22:39:00
Bob|2020-12-15 22:39:02
Carol|2020-12-15 22:39:05
David|2020-12-15 22:39:07

Adicionando várias linhas de uma vez

Agora crie uma segunda tabela:

> CREATE table IF NOT EXISTS linux (
...> distro TEXT NOT NULL)

Preencha-o com alguns dados de amostra, desta vez usando um pequeno atalho VALUES para que você possa adicionar várias linhas em apenas um comando. A palavra-chave VALUES espera uma lista entre parênteses, mas pode receber várias listas separadas por vírgulas:

> INSERT INTO linux (distro)
...> VALUES ('Slackware'), ('RHEL'),
...> ('Fedora'),('Debian');

Alterando uma tabela

Agora você tem duas tabelas, mas ainda não há relacionamento entre as duas. Cada uma delas contém dados independentes, mas talvez seja necessário associar um membro da primeira tabela a um item específico listado na segunda.

Para fazer isso, você pode criar uma nova coluna para a primeira tabela que corresponda a algo na segunda. Como ambas as tabelas foram projetadas com identificadores únicos (automaticamente, graças ao SQLite), a maneira mais fácil de conectá-las é usar o campo rowid de uma como seletor para a outra.

Crie uma nova coluna na primeira tabela para representar um valor na segunda tabela:

> ALTER TABLE member ADD os INT;

Usando os IDs exclusivos da tabela linux, atribua uma distribuição a cada membro. Como os registros já existem, você usa a palavra-chave SQL UPDATE em vez de INSERT. Especificamente, você deseja selecionar uma linha e atualizar o valor de uma coluna. Sintaticamente, isso é expresso um pouco ao contrário, com a atualização acontecendo primeiro e a seleção correspondente por último:

> UPDATE member SET os=1 WHERE name='Alice';

Repita esse processo para os outros nomes na tabela membro, apenas para preenchê-la com dados. Para variar, atribua três distribuições diferentes nas quatro linhas (dobrando em uma).

Unindo tabelas

Agora que essas duas tabelas estão relacionadas, você pode usar SQL para exibir os dados associados. Existem muitos tipos de junções em bancos de dados, mas você pode experimentar todos eles depois de conhecer o básico. Aqui está uma junção básica para correlacionar os valores encontrados no campo os da tabela member com o campo id do linux forte> tabela:

> SELECT * FROM member INNER JOIN linux ON member.os=linux.rowid;
Alice|2020-12-15 22:39:00|1|Slackware
Bob|2020-12-15 22:39:02|3|Fedora
Carol|2020-12-15 22:39:05|3|Fedora
David|2020-12-15 22:39:07|4|Debian

Os campos os e id formam a junção.

Em uma aplicação gráfica, você pode imaginar que o campo os pode ser definido por um menu suspenso, cujos valores são extraídos do conteúdo do campo distro do a tabela linux. Ao usar tabelas separadas para conjuntos de dados exclusivos, mas relacionados, você garante a consistência e a validade dos dados e, graças ao SQL, pode associá-los dinamicamente posteriormente.

Aprendendo mais

SQLite é um banco de dados independente, portátil e de código aberto infinitamente útil. Aprender a usá-lo de forma interativa é um excelente primeiro passo para gerenciá-lo em aplicativos da Web ou usá-lo por meio de bibliotecas de linguagens de programação.

Se você gosta de SQLite, também pode experimentar o Fossil do mesmo autor, Dr. Richard Hipp.

À medida que você aprende e usa o SQLite, pode ser útil ter uma lista de comandos comuns por perto, então baixe nossa folha de dicas do SQLite3 hoje mesmo!

Artigos relacionados: