55 lines
2.0 KiB
Python
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 |