api-admim/check_db.py

55 lines
2.0 KiB
Python

# check_db.py
import os
import sys
import time
import asyncio
from urllib.parse import urlparse
import asyncpg
async def check_database_connection():
DATABASE_URL = os.getenv("URL_BD")
if not DATABASE_URL:
print("Erro: Variável de ambiente URL_BD não definida.", file=sys.stderr)
sys.exit(1)
# Analisar a URL para obter os componentes
parsed_url = urlparse(DATABASE_URL)
DB_HOST = parsed_url.hostname
DB_PORT = parsed_url.port or 5432 # Default PostgreSQL port
DB_USER = parsed_url.username
DB_PASSWORD = parsed_url.password
DB_NAME = parsed_url.path.lstrip('/')
print(f"Tentando conectar ao banco de dados em {DB_HOST}:{DB_PORT}/{DB_NAME} como {DB_USER}...")
max_retries = 30 # Tentar por até 30 segundos (30 * 1s sleep)
retry_interval = 1
for i in range(max_retries):
try:
# Tentar conectar usando asyncpg
conn = await asyncpg.connect(
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME,
timeout=5 # Timeout para a tentativa de conexão
)
await conn.close()
print("Conexão com o banco de dados estabelecida com sucesso!")
sys.exit(0) # Sucesso!
except asyncpg.exceptions.PostgresError as e: # Captura erros específicos do asyncpg
print(f"Erro de conexão com o banco de dados (tentativa {i+1}/{max_retries}): {e}", file=sys.stderr)
await asyncio.sleep(retry_interval) # Usar await asyncio.sleep para sleep assíncrono
except Exception as e: # Captura outros erros inesperados
print(f"Erro inesperado durante a conexão (tentativa {i+1}/{max_retries}): {e}", file=sys.stderr)
await asyncio.sleep(retry_interval)
print("Falha ao conectar ao banco de dados após várias tentativas.", file=sys.stderr)
sys.exit(1) # Falha
if __name__ == "__main__":
asyncio.run(check_database_connection()) # Executa a função assíncrona