| # from sqlalchemy import create_engine | |
| # import os | |
| # import sys | |
| # from pathlib import Path | |
| # # ensure project root (agent/) is on sys.path so sibling packages like "s3" can be imported | |
| # project_root = Path(__file__).resolve().parents[2] # -> ...\openai_agents\agent | |
| # if str(project_root) not in sys.path: | |
| # sys.path.insert(0, str(project_root)) | |
| # from sqlalchemy.ext.declarative import declarative_base | |
| # from sqlalchemy.orm import sessionmaker | |
| # import urllib.parse | |
| # import psycopg2 | |
| # # from retrieve_secret import CONNECTIONS_HOST,CONNECTIONS_DB,CONNECTIONS_USER,CONNECTIONS_PASS | |
| # # from retrieve_secret import * | |
| # from retrieve_secret import * | |
| from sqlalchemy import create_engine | |
| import os | |
| import sys | |
| from pathlib import Path | |
| # ensure project root (mvp_2.0_deploy_all_apis/) is on sys.path so sibling packages like "retrieve_secret" can be imported | |
| project_root = Path(__file__).resolve().parents[1] # -> ...\mvp_2.0_deploy_all_apis (inner) | |
| if str(project_root) not in sys.path: | |
| sys.path.insert(0, str(project_root)) | |
| from sqlalchemy.ext.declarative import declarative_base | |
| from sqlalchemy.orm import sessionmaker | |
| import urllib.parse | |
| import psycopg2 | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| # from retrieve_secret import CONNECTIONS_HOST,CONNECTIONS_DB,CONNECTIONS_USER,CONNECTIONS_PASS | |
| # from retrieve_secret import * | |
| from retrieve_secret import * | |
| # --- Neon PostgreSQL credentials --- | |
| # PGHOST = 'ep-steep-dream-adqtvjel-pooler.c-2.us-east-1.aws.neon.tech' | |
| # PGDATABASE = 'neondb' | |
| # PGUSER = 'neondb_owner' | |
| # PGPASSWORD = 'npg_Qq0B1uWRXavx' | |
| # print(CONNECTIONS_HOST,"kkkk") | |
| # print("one") | |
| PGHOST =CONNECTIONS_HOST | |
| # print(PGHOST,"PGHOST") | |
| PGUSER = CONNECTIONS_USER | |
| PGPASSWORD = CONNECTIONS_PASS | |
| PGDATABASE = CONNECTIONS_DB | |
| # print(PGHOST,"PGHOST") | |
| # print(PGUSER,"PGUSER") | |
| # --- encode password --- | |
| encoded_password = urllib.parse.quote_plus(PGPASSWORD) | |
| # --- ensure target database exists (connects to default 'postgres') --- | |
| def ensure_database_exists(): | |
| try: | |
| conn = psycopg2.connect( | |
| host=PGHOST, | |
| user=PGUSER, | |
| password=PGPASSWORD, | |
| dbname="postgres", | |
| sslmode="require", | |
| ) | |
| conn.autocommit = True | |
| cur = conn.cursor() | |
| cur.execute("SELECT 1 FROM pg_database WHERE datname = %s", (PGDATABASE,)) | |
| if not cur.fetchone(): | |
| cur.execute(f'CREATE DATABASE "{PGDATABASE}" WITH OWNER {PGUSER} ENCODING \"UTF8\";') | |
| cur.close() | |
| conn.close() | |
| except Exception as e: | |
| # non-fatal: if creation fails (permissions), fallback to normal connect which will raise | |
| print(f"Warning: could not ensure database exists: {e}") | |
| ensure_database_exists() | |
| # ---connection URL --- | |
| DATABASE_URL = ( | |
| f"postgresql+psycopg2://{PGUSER}:{encoded_password}@{PGHOST}/{PGDATABASE}?sslmode=require" | |
| ) | |
| engine = create_engine( | |
| DATABASE_URL, | |
| pool_pre_ping=True, | |
| pool_recycle=300, | |
| echo=False | |
| ) | |
| SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) | |
| Base = declarative_base() | |
| # --- Dependency for FastAPI routes --- | |
| def get_db(): | |
| db = SessionLocal() | |
| try: | |
| yield db | |
| finally: | |
| db.close() | |
| # --- Optional: create tables on startup --- | |
| def create_tables(): | |
| from . import models | |
| Base.metadata.create_all(bind=engine) | |