Introdução ao SQLite e ao módulo sqlite3
O SQLite é um sistema de gerenciamento de banco de dados relacional compacto que não requer a instalação de um servidor separado, sendo ideal para o desenvolvimento de projetos pequenos e médios. Em Python, o suporte ao SQLite é implementado através do módulo integrado sqlite3, permitindo trabalhar com bancos de dados sem instalar bibliotecas adicionais.
O módulo sqlite3 transforma a criação e o uso de bancos de dados em um processo semelhante ao trabalho com arquivos comuns. Esta solução é especialmente valiosa para prototipagem, sistemas embarcados, aplicativos desktop e fins educacionais.
Instalação e compatibilidade
O módulo sqlite3 está incluído na biblioteca padrão do Python desde a versão 2.5 e está disponível sem instalação adicional. Ele oferece total compatibilidade com os sistemas operacionais Windows, macOS e Linux, fornecendo uma interface para trabalhar com o SQLite versão 3.
import sqlite3
Conectando ao banco de dados e criando uma conexão
Criando um banco de dados em arquivo
conn = sqlite3.connect('meu_banco.db')
Ao executar este comando, o banco de dados será criado automaticamente se o arquivo especificado não existir.
Criando um banco de dados em memória
conn = sqlite3.connect(':memory:')
Esta opção é especialmente útil para testes e operações temporárias.
Parâmetros adicionais de conexão
conn = sqlite3.connect('database.db',
check_same_thread=False,
detect_types=sqlite3.PARSE_DECLTYPES)
Criando tabelas e trabalhando com o esquema de dados
Criando tabelas
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE usuarios (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
idade INTEGER,
email TEXT UNIQUE,
criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
Tipos de dados no SQLite
O SQLite suporta cinco tipos principais de dados:
- INTEGER - números inteiros
- REAL - números de ponto flutuante
- TEXT - strings de texto
- BLOB - dados binários
- NULL - ausência de valor
O SQLite usa tipagem dinâmica, o que oferece flexibilidade, mas exige atenção ao trabalhar com os dados.
Operações CRUD (Create, Read, Update, Delete)
Inserindo dados
# Inserindo um registro
cursor.execute("INSERT INTO usuarios (nome, idade, email) VALUES (?, ?, ?)",
("João Silva", 30, "joao@exemplo.com"))
# Inserindo vários registros
dados_usuarios = [
("Maria Santos", 25, "maria@exemplo.com"),
("Pedro Oliveira", 35, "pedro@exemplo.com"),
("Ana Costa", 28, "ana@exemplo.com")
]
cursor.executemany("INSERT INTO usuarios (nome, idade, email) VALUES (?, ?, ?)", dados_usuarios)
conn.commit()
Consultando dados
# Selecionando todos os registros
cursor.execute("SELECT * FROM usuarios")
todos_usuarios = cursor.fetchall()
# Selecionando com condição
cursor.execute("SELECT nome, idade FROM usuarios WHERE idade > ?", (25,))
usuarios_adultos = cursor.fetchall()
# Selecionando com ordenação
cursor.execute("SELECT * FROM usuarios ORDER BY idade DESC")
usuarios_ordenados = cursor.fetchall()
Atualizando dados
cursor.execute("UPDATE usuarios SET idade = ? WHERE nome = ?", (31, "João Silva"))
conn.commit()
# Obtendo o número de linhas alteradas
print(f"Linhas atualizadas: {cursor.rowcount}")
Excluindo dados
cursor.execute("DELETE FROM usuarios WHERE nome = ?", ("Ana Costa",))
conn.commit()
print(f"Linhas excluídas: {cursor.rowcount}")
Transações e controle de alterações
Por padrão, o sqlite3 opera no modo de transação automática, onde cada comando DML é confirmado imediatamente. Para maior controle, você pode gerenciar transações manualmente:
try:
conn.execute("BEGIN")
cursor.execute("UPDATE usuarios SET idade = 40 WHERE nome = 'João Silva'")
cursor.execute("DELETE FROM usuarios WHERE nome = 'Maria Santos'")
conn.commit()
print("Transação concluída com sucesso!")
except Exception as e:
conn.rollback()
print(f"Erro na transação: {e}")
Otimização de desempenho
Usando executemany para inserções em lote
dados = [(f"Usuário {i}", i * 5) for i in range(1000)]
cursor.executemany("INSERT INTO usuarios (nome, idade) VALUES (?, ?)", dados)
conn.commit()
Desativando a sincronização para operações em massa
conn.execute("PRAGMA synchronous = OFF")
conn.execute("PRAGMA journal_mode = MEMORY")
Usando índices para acelerar consultas
cursor.execute("CREATE INDEX idx_email ON usuarios (email)")
Integração com Pandas
import pandas as pd
# Lendo dados do SQLite para um DataFrame
df = pd.read_sql_query("SELECT * FROM usuarios", conn)
# Escrevendo um DataFrame no SQLite
df.to_sql('usuarios_pandas', conn, if_exists='replace', index=False)
Fazendo backup do banco de dados
import shutil
shutil.copy2('meu_banco.db', 'backup_meu_banco.db')
Para bancos de dados em uso, utilize a função de backup integrada:
backup_conn = sqlite3.connect('backup.db')
conn.backup(backup_conn)
backup_conn.close()
Conclusão
O módulo sqlite3 do Python é uma ferramenta poderosa e versátil para gerenciar bancos de dados locais. Com ele, você pode criar aplicações completas sem depender de servidores externos, ideal para projetos que exigem simplicidade e portabilidade. Pratique os exemplos deste guia e explore mais recursos para dominar o SQLite em Python!
Também na biblioteca
Registro para C++: melhores soluções (spdlog, glog, P7)
Autorização e autenticação em PHP: guia completo com exemplos
Trabalhando com Kafka em PHP: bibliotecas, instalação e exemplos de código
Trabalho com CSV em PHP: biblioteca SplFileObject e funções integradas
Testes em JavaScript (Node.js): frameworks e ferramentas