42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""Small production-schema compatibility helpers.
|
|
|
|
The project has legacy production databases where some columns may not exist yet.
|
|
Use these helpers before introducing optional-column SQL in UI/services.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from functools import lru_cache
|
|
|
|
from sqlalchemy import text
|
|
|
|
from app.db import engine
|
|
|
|
|
|
@lru_cache(maxsize=256)
|
|
def has_column(table_name: str, column_name: str, schema_name: str = "public") -> bool:
|
|
table_name = str(table_name or "").strip()
|
|
column_name = str(column_name or "").strip()
|
|
schema_name = str(schema_name or "public").strip() or "public"
|
|
if not table_name or not column_name:
|
|
return False
|
|
with engine.begin() as conn:
|
|
return bool(conn.execute(text("""
|
|
SELECT 1
|
|
FROM information_schema.columns
|
|
WHERE table_schema = :schema_name
|
|
AND table_name = :table_name
|
|
AND column_name = :column_name
|
|
LIMIT 1
|
|
"""), {
|
|
"schema_name": schema_name,
|
|
"table_name": table_name,
|
|
"column_name": column_name,
|
|
}).scalar())
|
|
|
|
|
|
def opportunity_customer_column() -> str:
|
|
"""Return the customer link column supported by this deployment."""
|
|
if has_column("opportunities", "fiscal_customer_id"):
|
|
return "fiscal_customer_id"
|
|
return "local_customer_id"
|