# 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