flysmog.pages.dev

Como criar um script para validar CPF e integrar com banco de dados SQLite?

A validação de CPF é uma tarefa crítica em sistemas de cadastro e controle de acesso. Integrar essa validação diretamente com um banco de dados SQLite permite garantir a integridade dos dados desde o momento da entrada, evitando registros duplicados ou inválidos. Este método é eficaz porque combina a verificação algorítmica do CPF com a persistência em um banco de dados local, tudo automatizado em um único script Python.

Pré-requisitos

Criando o banco de dados SQLite

Primeiro, vamos criar um banco de dados SQLite com uma tabela para armazenar os CPFs validados. Execute o seguinte script para criar o banco e a tabela:

import sqlite3

# Conexão com o banco de dados (ou cria se não existir)
conn = sqlite3.connect('cadastro.db')
cursor = conn.cursor()

# Criar tabela para armazenar CPFs
cursor.execute('''
    CREATE TABLE IF NOT EXISTS usuarios (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        cpf TEXT UNIQUE NOT NULL,
        nome TEXT NOT NULL,
        data_cadastro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')

conn.commit()
conn.close()

Implementando a validação de CPF

A validação de CPF segue um algoritmo específico que verifica os dois dígitos verificadores. O código abaixo implementa essa validação:

def validar_cpf(cpf):
    # Remover caracteres não numéricos
    cpf = ''.join(filter(str.isdigit, cpf))

    # Verificar se o CPF tem 11 dígitos
    if len(cpf) != 11:
        return False

    # Verificar se todos os dígitos são iguais
    if cpf == cpf[0] * 11:
        return False

    # Calcular o primeiro dígito verificador
    soma = sum(int(digit) * (10 - i) for i, digit in enumerate(cpf[:9]))
    resto = soma % 11
    digito1 = 0 if resto < 2 else 11 - resto

    # Calcular o segundo dígito verificador
    soma = sum(int(digit) * (11 - i) for i, digit in enumerate(cpf[:10]))
    resto = soma % 11
    digito2 = 0 if resto < 2 else 11 - resto

    # Comparar com os dígitos verificadores do CPF
    return digito1 == int(cpf[9]) and digito2 == int(cpf[10])

Integrando validação com SQLite

Agora, vamos integrar a validação com o banco de dados, inserindo apenas CPFs válidos e não duplicados:

def inserir_usuario(cpf, nome):
    if not validar_cpf(cpf):
        return "CPF inválido"

    try:
        conn = sqlite3.connect('cadastro.db')
        cursor = conn.cursor()

        cursor.execute('''
            INSERT INTO usuarios (cpf, nome)
            VALUES (?, ?)
        ''', (cpf, nome))

        conn.commit()
        conn.close()
        return "Usuário inserido com sucesso"
    except sqlite3.IntegrityError:
        return "CPF já cadastrado"
    except Exception as e:
        return f"Erro: {str(e)}"

Exemplo Prático

Veja como o script funciona na prática:

CPF de Entrada Nome Resultado Esperado
123.456.789-09 João Silva CPF inválido
529.982.247-25 Maria Santos Usuário inserido com sucesso
529.982.247-25 Ana Costa CPF já cadastrado

Testando o script completo

Aqui está o script completo para testar a integração:

if __name__ == "__main__":
    # Testar com CPFs válidos e inválidos
    test_cases = [
        ("123.456.789-09", "João Silva"),
        ("529.982.247-25", "Maria Santos"),
        ("111.111.111-11", "Carlos Lima"),
        ("529.982.247-25", "Ana Costa")
    ]

    for cpf, nome in test_cases:
        resultado = inserir_usuario(cpf, nome)
        print(f"CPF: {cpf} | Nome: {nome} | Resultado: {resultado}")

Conclusão

Com este método, você automatiza a validação e inserção de CPFs em um banco de dados SQLite, garantindo que apenas registros válidos e únicos sejam armazenados. O script é eficiente, seguro e pode ser facilmente integrado a sistemas maiores de cadastro ou controle de acesso.