This commit is contained in:
daniel.rodrigues 2026-01-26 08:34:04 -03:00
parent 2fa715913e
commit 7292827c48

View File

@ -60,7 +60,11 @@ def get_token():
# ==============================
def insert_items_to_db(cursor, items):
"""Insere uma lista de itens no banco de dados"""
"""Insere uma lista de itens no banco de dados, deletando SKUs existentes antes"""
# Query para deletar SKU existente
delete_query = "DELETE FROM [dbo].[rgb_product] WHERE [sku] = ?"
insert_query = """
INSERT INTO [dbo].[rgb_product] (
[sku], [marketId], [tacticId], [strategicId], [brand], [internalCode],
@ -71,10 +75,19 @@ def insert_items_to_db(cursor, items):
"""
inserted = 0
deleted = 0
for item in items:
try:
sku = item.get("id")
# 1. Deletar SKU se já existir
cursor.execute(delete_query, sku)
if cursor.rowcount > 0:
deleted += cursor.rowcount
# 2. Inserir o novo registro
cursor.execute(insert_query,
item.get("id"),
sku,
item.get("marketId"),
item.get("tacticId"),
item.get("strategicId"),
@ -101,6 +114,10 @@ def insert_items_to_db(cursor, items):
if stats["errors"] <= 5:
print(f" ✗ Erro ao inserir SKU {item.get('id')}: {e}")
# Atualizar estatística de deletados
with stats_lock:
stats["skus_updated"] = stats.get("skus_updated", 0) + deleted
return inserted
@ -204,7 +221,7 @@ def fetch_and_insert_all_products(token):
"items_downloaded": 0,
"items_inserted": 0,
"errors": 0,
"deleted": 0
"skus_updated": 0 # SKUs que já existiam e foram atualizados
}
# 1. Descobrir o total de produtos
@ -233,32 +250,7 @@ def fetch_and_insert_all_products(token):
conn = pyodbc.connect(DB_CONNECTION_STRING)
cursor = conn.cursor()
# Verificar e deletar dados existentes para a data de ontem
print(f" Verificando dados existentes para {yesterday}...")
# A coluna updatedAt está no formato: 2025-10-26 11:38:46.0000000 -03:00
# Usamos CAST para comparar apenas a parte da data
check_query = """
SELECT COUNT(*) FROM [dbo].[rgb_product]
WHERE CAST([updatedAt] AS DATE) = ?
"""
cursor.execute(check_query, yesterday)
existing_count = cursor.fetchone()[0]
if existing_count > 0:
print(f" ⚠ Encontrados {existing_count} registros para {yesterday}. Deletando...")
delete_query = """
DELETE FROM [dbo].[rgb_product]
WHERE CAST([updatedAt] AS DATE) = ?
"""
cursor.execute(delete_query, yesterday)
deleted = cursor.rowcount
conn.commit()
stats["deleted"] = deleted
print(f"{deleted} registros deletados")
else:
print(f" ✓ Nenhum registro existente para {yesterday}")
print(f" Estratégia: Deletar SKU existente antes de inserir (upsert)")
print(f" Iniciando download e inserção...\n")
# Lock para acesso ao banco (uma conexão compartilhada)
@ -328,11 +320,11 @@ if __name__ == "__main__":
print(f"\n{'='*60}")
print("RESUMO FINAL")
print(f"{'='*60}")
print(f" Registros deletados: {result.get('deleted', 0)}")
print(f" Páginas baixadas: {result['pages_downloaded']}")
print(f" Páginas com falha: {result['pages_failed']}")
print(f" Itens baixados: {result['items_downloaded']}")
print(f" Itens inseridos: {result['items_inserted']}")
print(f" SKUs atualizados: {result.get('skus_updated', 0)} (já existiam)")
print(f" Erros de inserção: {result['errors']}")
print(f"{'='*60}")