Executando verificação de segurança...
2

Banco de dados sqlite com Python

OBS:

Olá! Esta é minha primeira postagem na plataforma. Na verdade, é minha primeira postagem informativa que publico em qualquer plataforma. Nunca fui de publicar nada que envolva meus conhecimentos, talvez por medo de ser julgado ou falta do que realmente postar. Mas ao ouvir sobre a premissa desta plataforma, tive que vir contribuir de alguma forma. Senti que eu devia fazer parte dessa barca. Espero que este post o ajude a entender o funcionamento do sqlite no python, e caso tenha algo a acrescentar, favor deixe nos comentários! Também aceito criticas construtivas ;)
Agora chega de falar de mim, e vamos para o código.

O sqlite

Mas pq logo o sqlite? Bem, gosto de sqlite pela sua simplicidade. Utiliza a linguagem sql (como o próprio nome já diz) e todo o banco fica em um arquivo de extensão ".db". Não é necessário um servidor para operar na base de dados, outro ponto que me atraiu.

Arquivo padrão de sqlite

Arquivo sqlite

Criando conexão

Antes de fazer operações no banco, devemos criar uma conexão com o banco. Para isso, primeiro importamos a biblioteca do sqlite e usamos o método connect, passando como parâmetro o caminho para o arquivo do banco ".db".
No exemplo a seguir, criei uma função que retorna uma conexão com o banco, junto com um try para caso haja algum erro no código.

Caso não saiba mexer com caminhos(paths) em python, clique aqui para ler um artigo sobre o mesmo. (Também recomendo aprender a biblioteca .os, que mexe justamente com caminhos, diretórios e essas paradas ;p)

import sqlite3
def conectar(p):
    try:
        con = sqlite3.connect(p)
        return con
    except sqlite3.Error as ex:
        print(ex)

caminho = ".\\banco\\agenda.db"
conexao = conectar(caminho)

Operando no banco de dados

Na hora de adicionar um registro, deletar, atualizar, e etc, devemos criar um cursor.

Mas Irlan, o que é um cursor?

Um cursor nada mais é do que um objeto vindo da conexão com o banco, que é responsável por executar os comandos sql no banco de dados.
Para criar um cursor, executaremos o seguinte código:
cursor = conexao.cursor()
(A variável não precisa de necessariamente chamada de cursor, mas eu a chamo assim para facilitar a compreensão.)

Criando uma tabela

Com o cursor criado, usamos o método cursor.execute(comando) vindo do cursor para executar um comando em sql. No nosso caso, iremos criar uma tabela "tb_contatos" em um banco de agenda utilizando o mesmo.

(Para facilitar a compreensão, não utilizarei o try except nos exemplos a seguir. Mas recomendo fortemente que o utilize para corrigir possíveis erros sem muita dor de cabeça.)

import sqlite3

def conectar(p):
    con = sqlite3.connect(p)
    return con
    
def criarTabela(con, sql):
    cursor = con.cursor()
    cursor.execute(sql)

caminhodoBanco = ".\\banco\\agenda.db"
conexao = conectar(caminho)
criarTabelaSql = "CREATE TABLE tb_contatos (id INT PRIMARY KEY AUTOINCREMENT, nome VARCHAR (20), email VARCHAR(30), telefone VARCHAR(15))"

criarTabela(conexao, criarTabelaSql)

Manipulando dados

Ao registrar, atualizar, e deletar dados, a lógica é a mesma. Utilizamos o método cursor.execute(sql).PORÉM, MUITO CUIDADO. Ao utilizar o método execute para alterar qualquer coisa que envolva os dados no banco, precisamos do método commit vindo na conexão para as mudanças permanecerem. Caso contrário, as mudanças não serão feitas.

def conectar(p):
    con = sqlite3.connect(p)
    return con
    
def registrar(con, sql):
    cursor = con.cursor()
    cursor.execute(sql)
    con.commit()

caminhodoBanco = ".\\banco\\agenda.db"
conexao = conectar(caminho)
registrarSql = "INSERT INTO tb_contatos (nome, email, telefone) VALUES ('Irlan', '[email protected]', '2069020'))"
registrar(conexao, registrarSql)

Consultar dados

Para fazer uma consulta de dados, a lógica continua a mesma. Porém não será necessário usar o commit, ja que não alterará nada nos dados. Ao invés disso, utilizaremos o .fetchall() que retornará uma lista com as tuplas contendo os dados.

def conectar(p):
    con = sqlite3.connect(p)
    return con
    
def consultar(con, sql):
    cursor = con.cursor()
    cursor.execute(sql)
    dados = cursor().fetchall()
    return dados

caminhodoBanco = ".\\banco\\agenda.db"
conexao = conectar(caminho)
consultarSql = "SELECT * FROM tb_contatos"

Finalização

Esse é o básico do sqlite para python. Espero ter sido informativo ;) Caso queira, posso criar outra postagem, ou atualizar essa com mais conteúdo sobre o assunto. Obrigado por ler até aqui, até a próxima!
Documentação da biblioteca sqlite3 oficial e em Portugês.
meme

Carregando publicação patrocinada...
2

Legal, bem simples e intuitivo. Não precisa se preocupar amigo, você não será julgado! Este é um pedaço de internet muito massa, onde o objetivo é a gente se ajudar.

Meu primeiro contato com banco de dados foi com sqlite, é bem legal de usar.

Gostaria de compartilhar apenas dois pensamentos.

Uma coisa que talvez seja relevante e possa ajudar, é usar três aspas para aumentar a legibilidade de queries maiores. Por exemplo:

my_long_query = """
    CREATE TABLE tb_contatos (
        id INT PRIMARY KEY AUTOINCREMENT,
        nome VARCHAR (20),
        email VARCHAR(30),
        telefone VARCHAR(15)
    )
"""

Daria para formatar de qualquer jeito que achasse melhor.

E também, uma feature interessante usando essa biblioteca é o segundo argumento do método execute, que serve para passar variáveis na query. Por exemplo:

con = sqlite3.connect('path/to/my/db.sqlite3')
cursor = con.cursor()
cursor.execute(
        'INSERT INTO tb_contatos (nome, email, telefone) VALUES (?, ?, ?)',
        ['Irlan', '[email protected]', '2069020']
)

Basicamente, cada item da lista será plugado no lugar de cada ?. Talvez desse para adaptar a função de registrar assim:

def registrar(con, sql, *args):
    cursor = con.cursor()
    cursor.execute(sql, *args)
    con.commit()

E sobre o meme no final, vamos aproveitar nossos últimos momentos com python, agora já está com 32 anos, resistindo bem 🥲

2

Pô, massinha! O lugar onde aprendi sobre sqlite mencionou o lance das três aspas dupla, mas acabei que nem dei tanta atenção.Mas olhando assim, fica bem mais fácil de se vizualizar ;D

Obrigado por complementar meu post, ajudou tanto a mim quanto a outras pessoas que leram/lerão. E o lance do segundo argumento do execute, eu admito que não sabia dessa! Mais uma vez obrigado por complementar meu post, cay 🤝

1

Tamo junto mano :D

Talvez você já saiba, mas sobre o segundo argumento do execute, talvez surja a dúvida: "Por que fazer isso se dá pra simplesmente usar uma f string?". Basicamente é para evitar um ataque chamado sql injection, onde um usuário malicioso envia para sua query caracteres perigosos, que podem ser interpretados como sendo código sql, que consegue modificar a query, ao invés de apenas um valor normal.

As bibliotecas usadas para interagir com banco de dados costumam ter recursos como esse para que elas consigam lidar com isso de forma apropriada, e garantir que os valores serão interpretados apenas como uma string e não como sql.

1

Vei, eu tava me perguntando exatamente isso! (não sei pq não te perguntei antes),mas de qualquer forma obrigado,vou usar!