Graduation_Project-v1.2 / Data /database /sql_connector.py
bat-6's picture
feat: implement SQL database connector with lazy engine and fallback support for project metadata loading
dca857f
Raw
History Blame Contribute Delete
3.03 kB
import pandas as pd
import json
_engine = None
def get_engine():
global _engine
if _engine is None:
from sqlalchemy import create_engine
import urllib
SERVER = "innotrack-sql-server.database.windows.net"
DATABASE = "InnoTrackDB"
USERNAME = "innotrackadmin"
PASSWORD = "Innotrack@admin233"
params = urllib.parse.quote_plus(
f"DRIVER={{ODBC Driver 18 for SQL Server}};"
f"SERVER={SERVER};"
f"DATABASE={DATABASE};"
f"UID={USERNAME};"
f"PWD={PASSWORD};"
"Encrypt=yes;"
"TrustServerCertificate=no;"
"Connection Timeout=30;"
)
connection_string = (
f"mssql+pyodbc:///?odbc_connect={params}"
)
_engine = create_engine(connection_string, pool_pre_ping=True)
# Test connection once lazily
try:
with _engine.connect() as conn:
print("SQL Connected Successfully")
except Exception as e:
print("Connection Failed")
print(e)
return _engine
class LazyEngine:
def __getattr__(self, name):
return getattr(get_engine(), name)
def __repr__(self):
return repr(get_engine())
engine = LazyEngine()
def load_preprocessed_projects():
try:
query = """
SELECT *
FROM preprocess
"""
with engine.connect() as conn:
df = pd.read_sql(
query,
conn
)
if "features" in df.columns:
def parse_features(x):
if not isinstance(x, str):
return x
try:
x = json.loads(x)
if isinstance(x, str):
x = json.loads(x)
return x
except Exception:
return []
df["features"] = df["features"].apply(parse_features)
return df
except Exception as e:
print(f"Database connection failed, falling back to local metadata file. Error: {e}")
import os
from pathlib import Path
possible_paths = [
Path(__file__).resolve().parents[2] / "models" / "metadata.parquet",
Path("models/metadata.parquet"),
Path("../models/metadata.parquet"),
]
for path in possible_paths:
if path.exists():
print(f"Loading local metadata from {path}")
df = pd.read_parquet(path)
if "features" in df.columns:
df["features"] = df["features"].apply(
lambda x: x.tolist() if hasattr(x, "tolist") else (list(x) if isinstance(x, (list, tuple, set)) else [])
)
return df
raise FileNotFoundError(f"Could not connect to database and local metadata.parquet was not found. Looked in: {[str(p) for p in possible_paths]}")