NEW

Como resolver erro de driver ODBC SQL Server em Python: guia completo para instalar e configurar drivers atualizados no Windows 2025

Introdução

Um dos erros mais comuns ao trabalhar com conexões de banco de dados SQL Server em aplicações Python é a ausência ou incompatibilidade de drivers ODBC. Este guia apresenta soluções práticas para identificar, instalar e configurar os drivers necessários, garantindo que suas aplicações funcionem corretamente em diferentes ambientes.

O Problema dos Drivers ODBC

Quando você desenvolve uma aplicação que se conecta ao SQL Server e a distribui para outras máquinas, é comum encontrar o erro indicando que o driver ODBC especificado não está disponível no sistema de destino. Isso acontece porque os drivers ODBC não são instalados por padrão em todas as máquinas Windows.

Verificando se o Driver Está Instalado

Antes de instalar novos drivers, é fundamental verificar quais já estão disponíveis no sistema:

Método 1: Interface Gráfica

  1. Abra o menu Iniciar e digite odbcad32
  2. Execute o programa "Fontes de Dados ODBC"
  3. Navegue até a aba "Drivers"
  4. Procure por drivers como:
    • SQL Server Native Client 11.0
    • ODBC Driver 17 for SQL Server
    • ODBC Driver 18 for SQL Server

Método 2: Verificação via Python

Você pode verificar programaticamente quais drivers estão disponíveis:

python

import pyodbc # Lista todos os drivers ODBC disponíveis drivers = pyodbc.drivers() print("Drivers ODBC disponíveis:") for driver in drivers: print(f"- {driver}") # Verifica se um driver específico está presente if "ODBC Driver 17 for SQL Server" in drivers: print("✅ Driver recomendado encontrado!") else: print("❌ Driver recomendado não encontrado.")

Instalando o Driver Correto

Opção 1: SQL Server Native Client 11.0 (Legado)

Este é um driver mais antigo, mas ainda amplamente usado. Para instalá-lo:

  • Acesse o site oficial da Microsoft
  • Procure por "SQL Server Native Client 11.0"
  • Baixe e instale a versão apropriada (x86 ou x64)

Opção 2: ODBC Driver 17 for SQL Server (Recomendado)

Este é o driver atualmente recomendado pela Microsoft:

  • Oferece melhor compatibilidade
  • Suporte a recursos mais recentes
  • Maior estabilidade e performance
  • Disponível para Windows, Linux e macOS

Para instalação:

  1. Acesse o site oficial da Microsoft
  2. Procure por "Microsoft ODBC Driver 17 for SQL Server"
  3. Baixe o instalador apropriado para seu sistema
  4. Execute a instalação com privilégios administrativos

Opção 3: ODBC Driver 18 for SQL Server (Mais Recente)

A versão mais atual, com suporte aprimorado para autenticação e criptografia.

Configurando sua Aplicação

Atualizando o Arquivo de Configuração

Se você usa um arquivo de configuração JSON para armazenar as configurações de conexão:

json

{ "server": "seu-servidor", "database": "sua-database", "driver": "ODBC Driver 17 for SQL Server", "trusted_connection": "yes" }

String de Conexão Atualizada

Exemplo de como usar o driver moderno em sua string de conexão:

python

import pyodbc import json # Carrega configurações with open('sqlserver.json', 'r') as f: config = json.load(f) # Monta a string de conexão connection_string = ( f"DRIVER={{{config['driver']}}};" f"SERVER={config['server']};" f"DATABASE={config['database']};" f"Trusted_Connection={config['trusted_connection']};" ) # Estabelece conexão try: connection = pyodbc.connect(connection_string) print("✅ Conexão estabelecida com sucesso!") except pyodbc.Error as e: print(f"❌ Erro na conexão: {e}")

Implementando Verificação Automática

Para tornar sua aplicação mais robusta, implemente uma verificação automática de driver:

python

import pyodbc import sys def verificar_driver_odbc(driver_nome="ODBC Driver 17 for SQL Server"): """ Verifica se o driver ODBC especificado está disponível no sistema """ drivers_disponiveis = pyodbc.drivers() if driver_nome not in drivers_disponiveis: print(f"❌ Driver '{driver_nome}' não encontrado.") print("Drivers disponíveis:") for driver in drivers_disponiveis: print(f" - {driver}") print(f"\nPara resolver este problema:") print(f"1. Instale o '{driver_nome}' do site da Microsoft") print(f"2. Ou modifique sua configuração para usar um driver disponível") return False print(f"✅ Driver '{driver_nome}' encontrado e pronto para uso!") return True # Verificação antes de tentar conectar if not verificar_driver_odbc(): sys.exit(1) # Continua com a lógica da aplicação...

Script de Instalação Automática

Para facilitar a distribuição de sua aplicação, você pode criar um script que automatiza a instalação do driver:

batch

@echo off echo Verificando driver ODBC para SQL Server... :: Verifica se o driver já está instalado reg query "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Driver 17 for SQL Server" >nul 2>&1 if %errorlevel% == 0 ( echo Driver ODBC 17 já está instalado. goto :end ) echo Driver não encontrado. Iniciando download... :: Baixa e instala o driver (exemplo para x64) powershell -Command "Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/?linkid=2249006' -OutFile 'msodbcsql.msi'" msiexec /i msodbcsql.msi /quiet /norestart echo Instalação concluída! :end pause

Tratamento de Erros Comum

Implemente tratamento robusto de erros para diferentes cenários:

python

import pyodbc from typing import Optional class ConexaoSQLServer: def __init__(self, config_file: str): self.config = self._carregar_config(config_file) self.connection: Optional[pyodbc.Connection] = None def _carregar_config(self, config_file: str) -> dict: """Carrega configurações do arquivo JSON""" try: with open(config_file, 'r') as f: return json.load(f) except FileNotFoundError: raise FileNotFoundError(f"Arquivo de configuração '{config_file}' não encontrado.") except json.JSONDecodeError: raise ValueError(f"Arquivo de configuração '{config_file}' contém JSON inválido.") def conectar(self) -> bool: """Estabelece conexão com o banco de dados""" try: # Verifica se o driver está disponível if self.config['driver'] not in pyodbc.drivers(): print(f"❌ Driver '{self.config['driver']}' não disponível.") return False # Monta string de conexão connection_string = self._montar_string_conexao() # Estabelece conexão self.connection = pyodbc.connect(connection_string, timeout=10) print("✅ Conexão estabelecida com sucesso!") return True except pyodbc.InterfaceError as e: print(f"❌ Erro de interface ODBC: {e}") return False except pyodbc.DatabaseError as e: print(f"❌ Erro de banco de dados: {e}") return False except Exception as e: print(f"❌ Erro inesperado: {e}") return False def _montar_string_conexao(self) -> str: """Monta a string de conexão baseada na configuração""" return ( f"DRIVER={{{self.config['driver']}}};" f"SERVER={self.config['server']};" f"DATABASE={self.config['database']};" f"Trusted_Connection={self.config.get('trusted_connection', 'yes')};" )

Melhores Práticas

1. Sempre Use o Driver Mais Recente

Prefira o "ODBC Driver 17 for SQL Server" ou "ODBC Driver 18 for SQL Server" em vez de versões mais antigas como o Native Client 11.0.

2. Documente os Requisitos

Inclua em sua documentação quais drivers são necessários e como instalá-los.

3. Implemente Verificações Robustas

Sempre verifique a disponibilidade do driver antes de tentar estabelecer conexões.

4. Considere Ambientes Diferentes

Teste sua aplicação em diferentes versões do Windows e considere as diferenças entre arquiteturas x86 e x64.

5. Forneça Alternativas

Permita que o usuário configure drivers alternativos caso o preferencial não esteja disponível.

Conclusão

A gestão adequada de drivers ODBC é fundamental para garantir que aplicações Python que se conectam ao SQL Server funcionem corretamente em diferentes ambientes. Seguindo as práticas apresentadas neste guia, você pode criar aplicações mais robustas e facilitar a experiência do usuário final.

Lembre-se sempre de manter os drivers atualizados e documentar claramente os requisitos de sistema para sua aplicação. Com essas medidas, você minimizará problemas relacionados à conectividade e proporcionará uma experiência mais estável para os usuários.

Guia Completo: Resolvendo Problemas de Driver ODBC para SQL Server

Leia mais

 Listening to your favorite music on Bluetooth headphones, have you ever wondered what those mysterious acronyms—like SBC, AAC, aptX, LDAC, and LHDC—actually mean? You might assume those letters decide whether your music sounds amazing or just “meh.” In this post, you'll learn exactly what Bluetooth codecs do, how they impact your audio, and whether you really need to stress about them when buying new headphones.

📌Gráfico explicativo com comparação entre os principais codecs Bluetooth e seu impacto na qualidade de som em dispositivos Android e iOS:
Gráfico explicativo com comparação entre os principais codecs Bluetooth e seu impacto na qualidade de som em dispositivos Android e iOS


🎧 How Bluetooth Audio Actually Works — Why Codecs Matter

Wireless headphones are everywhere. Almost every model promises "studio-quality" or "crystal-clear" audio. But here's the raw truth: Bluetooth can't transmit uncompressed, ultra-high-quality audio. It has limitations. So how does your music go from your phone to your ears?

Imagine a water pipe connecting a tank (your phone) to a glass (your headphones). The size, shape, and cleanliness of the pipe affect how the water flows. The Bluetooth codec is that pipe—it moves your music from one device to another, and its design affects the result.


📦 What Is a Codec, Really?

A codec stands for coder-decoder. It prepares music for Bluetooth transmission on one end and reconstructs it on the other. Most Bluetooth codecs are lossy, meaning they discard some of the original audio data to make the file smaller—think MP3s: more compact, with a touch of quality loss.

So even if you start with a lossless file (like FLAC or WAV), Bluetooth compresses it again. No matter how you slice it, your wireless headphones are hearing a remixed and repackaged version of the original sound.

Lossy compression can shave off stereo detail, soften sharp moments (transients), remove "air" between instruments, and sometimes introduce weird digital noises (artifacts).


🎯 4 Key Factors That Shape Bluetooth Audio Quality

How a codec affects sound comes down to:

  1. Bitrate – How many data bits are sent per second. Higher usually means better quality.

  2. Latency – The delay between a sound happening and you hearing it.

  3. Processing Complexity – How hard your phone and headphones need to work to decode it.

  4. Robustness – How well the codec handles interference and signal drops.

Let’s break down how each common codec performs—in plain English.


🔍 Common Bluetooth Codecs: Strengths and Weaknesses

🔹 SBC – The Universal Default

  • Bitrate: Up to 345 kbps (mono), 328 kbps (stereo); typically 220–240 kbps in real use

  • Latency: High, ~200–300 ms

  • Sound: Basic quality, often misses finer details, smooths out highs and ambient textures

📌 If your headphones don’t list a codec, you’re likely getting SBC.


🔸 AAC – Apple’s Favorite

  • Bitrate: 128–256 kbps

  • Audio: More detailed than SBC, preserves transients and balance well

  • Latency: ~120 ms on iPhones (hardware-accelerated); Android performance varies—sometimes great, sometimes muddy depending on device


🔷 aptX Family – Qualcomm’s Toolbox

aptX (Classic)

  • Bitrate: 352 kbps

  • Latency: ~150 ms

  • Sound: Better than SBC, but outdated

aptX HD

  • Bitrate: 576 kbps (48kHz, 24-bit)

  • Latency: 180–200 ms

  • Audio: Richer detail if both devices support it

aptX Adaptive

  • Bitrate: 276–420 kbps (dynamic)

  • Latency: Can drop to 50–80 ms in gaming mode

  • Note: Both devices must support it for full benefit


🔵 LDAC – Sony’s High-Resolution Push

  • Bitrates: 330 / 660 / 990 kbps

  • Compression: Prioritizes soundstage and clarity

  • Latency: High (180–240 ms), drops further on unstable connections

  • Trade-off: Quality can tank if Bluetooth strength dips


🟡 LHDC – The Chinese Challenger

  • Bitrate: 400–900 kbps (up to 1200 theoretical)

  • Latency: 120–150 ms

  • Pros: More stable than LDAC, lighter processing load

  • Cons: Hard to find support; inconsistent across devices


🟠 SSC (Samsung Scalable Codec)

  • Bitrate: 88–512 kbps (adaptive)

  • Latency: Consistent ~100 ms

  • Drawback: Low bitrate = softer detail

  • Availability: Only on Samsung Galaxy phones + Galaxy Buds


🎧 Do Bluetooth Codecs Really Make a Big Difference?

🔬 What Lab Tests and Blind Listening Show

In controlled tests, most people can't reliably tell the difference between AAC, LDAC, and aptX—especially on regular headphones. The most noticeable difference is between SBC and higher-end codecs. Even then, the margin is smaller than you'd expect.

🎵 Audiophiles, musicians, and sound engineers might pick up subtle differences—but even they admit it’s marginal.


📌 When Codec Choice Truly Matters

There are rare cases where a bad codec pairing ruins sound. Example: using cheap QCY headphones on an iPhone (which uses AAC) can sound way worse than on Android. Incompatibility or bad implementation, not just the codec, causes issues.

🎧 Overall: The quality of your headphones, music source, and environment matter more than the codec.


🧩 Codecs Are Only One Piece of the Audio Puzzle

Think of codecs like fuel types. Premium fuel helps, but it won’t turn a weak car into a sports car. The driver, engine, and tires still matter more.

🛠️ Your audio experience depends much more on:

  • Music quality

  • Headphone build and driver tech

  • Fit and comfort

  • Your listening environment


Practical Advice: Don’t Obsess Over Codecs

Unless you're chasing perfection, don't lose sleep over codec settings. Focus on:

  • Comfort and sound quality

  • Battery life and connection stability

  • Whether your device supports the same codec as your headphones

📱 iPhones mostly offer AAC and SBC, and that’s plenty for most users.


👁️‍🗨️ How to Check What Codec You're Using

  • Android: Enable Developer Options > Bluetooth Audio Codec

  • Windows: Some music apps show the active codec

  • iPhone: Defaults to AAC or SBC—no user control

Want to experiment? Switch codecs or devices and play the same track. Listen for clarity, stage width, and delay.

🎯 If you hear a difference—great! If not, even better: you can relax and enjoy the music.


💬 Your Turn: What’s Your Experience with Bluetooth Codecs?

Have you checked what codec your headphones use? Try a blind test and see if you notice a difference. Share your thoughts in the comments and help others figure it out too!


📚 Explore More: Tips, Tools & Playlists

  • 🎧 My headphone recommendations, including some hidden gems

  • 📜 Full list of audio gear suggestions for every budget

  • 🎶 A curated playlist to test headphones and spot real vs. placebo differences


🧠 Quick Glossary

  • Codec: Software that compresses/decompresses audio

  • Bitrate: Data per second (kbps). More = better quality

  • Latency: Delay between source audio and playback

  • Lossy: Compression that permanently removes data

  • Artifacts: Strange digital noises caused by over-compression


Conclusion

Bluetooth audio codecs can seem complex, but once you understand them, they’re just one part of the sound chain. For most listeners, codecs like AAC, aptX, and LDAC perform similarly in real life. Instead of chasing specs, listen with your ears.

Still curious? Try a test, compare notes with friends, and enjoy your journey through wireless sound. 🎧🔊


Se quiser, posso formatar essa versão para Blogger com imagem destacada, palavras-chave, link amigável e outros elementos de SEO. Deseja isso também?

Bluetooth Audio Codecs Explained: SBC, AAC, aptX, LDAC, and LHDC – What Really Matters for Sound Quality?

Leia mais

Você já desmontou uma plaquinha de carregamento e se deparou com três fios — vermelho, preto e azul — e percebeu que, sem o fio azul conectado corretamente, a placa simplesmente não funciona? Então este artigo é para você.

✅ O que é essa plaquinha?

A placa analisada é a SX-W25-Charger-V1.4, comum em dispositivos como fones de ouvido TWS, powerbanks ou caixas de som. Ela possui:

  • Conector USB-C para entrada de energia;
  • LEDs indicadores;
  • Botão de acionamento;
  • E três fios: vermelho (VCC), preto (GND) e azul (sensor).

📌 Função do fio azul

O fio azul está conectado a um sensor de temperatura (termistor NTC) que fica na bateria. A placa verifica a resistência desse sensor antes de liberar a carga, como uma proteção contra superaquecimento.

Se o fio azul não estiver com a resistência esperada, a placa não ativa a saída de energia.

🎯 Como simular esse sensor?

A forma mais simples e segura de “burlar” ou simular o sensor é utilizando um resistor de 10kΩ entre os fios azul e preto.

Passo a passo:

  1. Identifique os fios:
    🔴 Vermelho: VCC
    ⚫ Preto: GND
    🔵 Azul: Sensor
  2. Solde um resistor de 10kΩ (1/4W ou menor) entre o fio azul e o fio preto.
  3. Conecte a alimentação na entrada USB-C da placa.
  4. O LED da placa deve acender, indicando que a simulação funcionou.

💡 Posso usar um LED ou lâmpada no lugar do resistor?

Não é recomendado. O sensor espera uma resistência fixa, e componentes como LEDs ou lâmpadas não têm esse comportamento.

⚠️ Isso pode impedir o funcionamento do carregador ou até danificar a placa.

🔌 Quer um indicador visual? Use um LED externo!

Você pode adicionar um LED indicador externo da seguinte forma:

  • Ligue o LED entre o fio vermelho (VCC) e o fio preto (GND), com um resistor de 220Ω para limitar a corrente.
  • Assim, você terá o sistema funcionando com o resistor de 10kΩ e um LED acendendo quando a placa receber energia.

📷 Imagens do projeto:

📌 Ligação do resistor na prática:
Ligação do resistor entre fio azul e preto

📌 Diagrama ilustrado:
Diagrama de ligação do resistor de 10kΩ

✅ Conclusão

Ao simular corretamente o sensor com um resistor de 10kΩ, você pode reaproveitar placas de carregamento que normalmente exigiriam sensores originais. É uma solução simples, funcional e segura para projetos de eletrônica e reaproveitamento de hardware.


🛠️ Como Simular o Sensor de Temperatura em Placas Carregadoras com um Resistor de 10kΩ

Leia mais

Ilustração explicando a remoção da tag version em arquivos modernos do Docker Compose
Ilustração explicando a remoção da tag version em arquivos modernos do Docker Compose

Se você trabalha com Docker Compose há algum tempo, certamente já se deparou com a propriedade version no topo dos seus arquivos docker-compose.yml. Essa linha, que antes era considerada essencial, agora se tornou oficialmente obsoleta.


Neste artigo, vamos explorar por que essa mudança aconteceu e como você pode modernizar seus projetos Docker de forma simples e eficaz.


O Que Mudou no Docker Compose?

Para entender melhor essa transformação, vamos analisar um exemplo prático. Considere este arquivo Docker Compose tradicional:


yaml

version: '3.8'


services:


  auth-db:

    image: postgres:11

    container_name: auth-db

    restart: always

    environment:

      

      - POSTGRES_DB=auth-db


      - POSTGRES_USER=admin


      - POSTGRES_PASSWORD=123456

    ports:

      - 5432:5432

Ao executar docker compose up com esse arquivo, você provavelmente verá este aviso:


WARN[0000] \\Documents\\git\\curso-comunicacao-servicos\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"

⠀⠀⠀⠀

Por Que a Propriedade Version Se Tornou Obsoleta?

A Evolução do Docker Compose

Originalmente, a propriedade version tinha uma função importante: especificar qual versão do schema do Compose file seria utilizada. Isso era fundamental para manter a compatibilidade com versões anteriores e garantir que diferentes recursos funcionassem adequadamente.


No entanto, o Docker Compose evoluiu significativamente. Hoje, ele utiliza automaticamente a Compose Specification mais recente como padrão, tornando desnecessário especificar uma versão manualmente.


Benefícios da Nova Abordagem

Simplicidade: Menos configuração manual significa menos chances de erro

Atualizações automáticas: Você sempre terá acesso aos recursos mais recentes

Menos manutenção: Não precisa mais se preocupar em atualizar versões nos arquivos

Como o Docker Compose Funciona Atualmente?

A Compose Specification

O Docker Compose agora se baseia inteiramente na Compose Specification para interpretar seus arquivos docker-compose.yml. Esta especificação é constantemente atualizada para incluir:


Novos recursos e funcionalidades

Melhorias de performance

Correções de bugs

Otimizações de segurança

Detecção Automática

Quando você executa o Docker Compose, ele automaticamente:

Analisa seu arquivo de configuração

Aplica o schema mais recente suportado

Utiliza todos os recursos disponíveis

O Que Você Deve Fazer Agora?

1. Remova a Propriedade Version

É completamente seguro deletar a linha version dos seus arquivos docker-compose.yml. Sua funcionalidade permanecerá intacta. Veja como fica o exemplo anterior:


yaml

services:


  auth-db:

    image: postgres:11

    container_name: auth-db

    restart: always

    environment:

      

      - POSTGRES_DB=auth-db


      - POSTGRES_USER=admin


      - POSTGRES_PASSWORD=123456

    ports:

      - 5432:5432

2. Aproveite os Recursos Mais Recentes

Com a Compose Specification sempre atualizada, você pode:


Usar novos tipos de volume

Implementar recursos de rede avançados

Aproveitar melhorias de performance

Utilizar novas opções de deploy

3. Ignore os Avisos (Por Enquanto)

Se você ainda tem arquivos com a propriedade version, os avisos podem ser ignorados com segurança. No entanto, é uma boa prática removê-la para manter seus arquivos limpos e atualizados.


Dicas Práticas Para Modernizar Seus Projetos

Auditoria dos Arquivos Existentes

Faça uma verificação em todos os seus projetos:


Identifique arquivos com version especificada

Teste a remoção em ambiente de desenvolvimento

Documente as mudanças para sua equipe

Automatização da Limpeza

Considere criar um script simples para remover automaticamente as linhas version dos seus arquivos:


bash

# Exemplo básico para remover linhas version

sed -i '/^version:/d' docker-compose.yml

Mantenha a Documentação Atualizada

Atualize sua documentação interna para refletir essas mudanças e eduque sua equipe sobre as melhores práticas atuais.


Benefícios de Seguir as Práticas Atuais

Para Desenvolvedores

Menos configuração: Foco no que realmente importa - seus serviços

Compatibilidade garantida: Sempre usando a versão mais estável

Aprendizado contínuo: Acesso automático a novos recursos

Para Equipes

Padronização: Todos usando a mesma abordagem

Manutenção simplificada: Menos pontos de configuração para gerenciar

Produtividade: Menos tempo gasto com configurações técnicas

Conclusão: Simplifique e Modernize

A remoção da propriedade version representa mais do que uma simples mudança técnica - é um reflexo da maturidade do Docker Compose como ferramenta. Ao eliminar essa necessidade, o Docker tornou a experiência do desenvolvedor mais fluida e intuitiva.


Lembre-se: O foco deve estar sempre no conteúdo do seu arquivo Compose - na definição dos seus serviços, redes, volumes e outros componentes - e não em preocupações com versionamento.


Está pronto para modernizar seus projetos Docker? Comece removendo a propriedade version dos seus arquivos e aproveite a simplicidade que a evolução do Docker Compose trouxe para o seu workflow de desenvolvimento.


Quer se aprofundar ainda mais em Docker e containerização? Explore recursos avançados da Compose Specification e descubra como otimizar ainda mais seus projetos com as melhores práticas atuais do mercado.


Ainda Usando Version no Docker Compose? Descubra Por Que É Hora de Parar

Leia mais

 

Script Python para deletar registros antigos do SQL Server com leitura de JSON e geração de log automático.
Script Python para deletar registros antigos do SQL Server com leitura de JSON e geração de log automático.

Manter a base de dados enxuta e saudável é fundamental para a performance de qualquer sistema. Mas, como fazer isso de forma prática, segura e sem precisar mexer em cada detalhe do código a cada nova execução?

Neste artigo, vou te mostrar como criar um script em Python que deleta registros antigos de uma tabela no SQL Server com base em um intervalo de datas, usando um arquivo de configuração .json. E mais: o script gera logs automáticos com a quantidade de registros excluídos — tudo sem complicação!

🧠 Por que automatizar a exclusão de dados?

Com o tempo, bancos de dados crescem demais e começam a apresentar problemas como lentidão nas consultas, travamentos e até erros de sincronização. Ao automatizar a limpeza periódica, você:

  • Melhora o desempenho das consultas;

  • Evita acúmulo de dados desnecessários;

  • Ganha tempo ao não depender de comandos manuais;

  • Cria um processo reversível e seguro (com logs para rastreabilidade).


🛠️ O que esse script Python faz?

  • Lê dados de conexão e intervalo de datas a partir de um arquivo .json;

  • Executa a exclusão de registros com base em uma coluna de data;

  • Gera um log.txt informando data, tabela e número de registros deletados;

  • Roda de forma simples e reutilizável para diferentes tabelas ou datas.


📁 Estrutura do Projeto

bash

/limpador_sql/ │ ├── main.py # Script principal ├── configuracao.json # Arquivo com os parâmetros └── log.txt # Registro automático da execução

📦 Exemplo de configuracao.json

json

{ "conexao": { "server": "SEU_SERVIDOR", "database": "SUA_BASE", "username": "SEU_USUARIO", "password": "SUA_SENHA", "driver": "ODBC Driver 17 for SQL Server" }, "consulta": { "tabela": "nome_da_tabela", "coluna_data": "data_criacao", "data_inicio": "2023-01-01", "data_fim": "2023-12-31" } }


Script Python


import pyodbc import json from datetime import datetime def carregar_configuracao(caminho_arquivo): with open(caminho_arquivo, 'r', encoding='utf-8') as f: return json.load(f) def registrar_log(tabela, qtd_linhas, data_inicio, data_fim): log_entry = ( f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] " f"Tabela: {tabela} | Linhas deletadas: {qtd_linhas} | " f"Período: {data_inicio} até {data_fim}\n" ) with open("log.txt", "a", encoding="utf-8") as log_file: log_file.write(log_entry) def deletar_registros(config): conn_info = config['conexao'] consulta = config['consulta'] server = conn_info['server'] database = conn_info['database'] username = conn_info['username'] password = conn_info['password'] driver = conn_info['driver'] tabela = consulta['tabela'] coluna_data = consulta['coluna_data'] data_inicio = consulta['data_inicio'] data_fim = consulta['data_fim'] dt_inicio = datetime.strptime(data_inicio, "%Y-%m-%d") dt_fim = datetime.strptime(data_fim, "%Y-%m-%d") conn_str = f"""DRIVER={{{driver}}}; SERVER={server}; DATABASE={database}; UID={username}; PWD={password}""" try: conn = pyodbc.connect(conn_str) cursor = conn.cursor() query = f""" DELETE FROM {tabela} WHERE {coluna_data} >= ? AND {coluna_data} <= ? """ cursor.execute(query, dt_inicio, dt_fim) qtd = cursor.rowcount conn.commit() print(f"[OK] {qtd} registros deletados da tabela '{tabela}'.") registrar_log(tabela, qtd, data_inicio, data_fim) except Exception as e: print(f"[ERRO] Falha ao deletar registros: {e}") registrar_log(tabela, "ERRO", data_inicio, data_fim) finally: if 'cursor' in locals(): cursor.close() if 'conn' in locals(): conn.close() if __name__ == "__main__": config = carregar_configuracao("configuracao.json") deletar_registros(config)

Basta alterar as datas e o nome da tabela no .json e rodar o script novamente. Isso evita alterações diretas no código!


🔥 Como executar o script

Com Python e a biblioteca pyodbc instalados, digite no terminal:

bash

python main.py

E pronto! Os registros serão apagados e você verá algo como:

csharp

[OK] 1.243 registros deletados da tabela 'pedidos'.

E o arquivo log.txt será automaticamente atualizado:

yaml

[2025-06-27 22:15:38] Tabela: pedidos | Linhas deletadas: 1243 | Período: 2023-01-01 até 2023-12-31


✅ Benefícios dessa abordagem

  • Modularidade: separação entre código e configuração.

  • Segurança: nenhuma informação sensível exposta no script.

  • Controle: log detalhado de todas as execuções.

  • Facilidade: qualquer um da equipe pode rodar o script apenas atualizando o .json.


📌 Dica extra: agende a execução!

Se quiser que o script rode automaticamente todo mês, por exemplo, basta configurá-lo no Agendador de Tarefas do Windows ou usar o cron no Linux.


🧩 O próximo passo?

Se quiser ir além, você pode:

  • Exportar os registros deletados para um backup .csv antes da exclusão;

  • Adicionar múltiplas tabelas ao JSON;

  • Criar uma interface simples com data de início/fim para qualquer usuário executar.


💬 Conclusão

Automatizar a limpeza do banco de dados com Python é uma solução inteligente, segura e escalável. E o melhor: você pode reutilizar o mesmo script com diferentes tabelas e datas, apenas trocando o conteúdo do arquivo de configuração.

Gostou da ideia? Que tal começar agora mesmo a aplicar essa solução no seu ambiente?

🐍 Como Automatizar a Limpeza de Registros no SQL Server com Python e JSON (Com Log)

Leia mais

✝ Copyright © Blog do KDS - Isaías 40:5 “A glória do Senhor se manifestará, e toda a humanidade a verá.”