optimised api speed, good enough for now

This commit is contained in:
Khalim Conn-Kowlessar 2023-08-21 11:32:50 +01:00
parent c413482bf4
commit f2fc921bc5
4 changed files with 31 additions and 20 deletions

View file

@ -32,4 +32,4 @@ def aggregate_portfolio_recommendations(session, portfolio_id: int):
# Merge the updated portfolio back into the session # Merge the updated portfolio back into the session
session.merge(portfolio) session.merge(portfolio)
session.commit() session.flush()

View file

@ -31,7 +31,7 @@ def create_property(session, portfolio_id: int, address: str, postcode: str) ->
# Merge the updated property back into the session # Merge the updated property back into the session
session.merge(existing_property) session.merge(existing_property)
session.commit() session.flush()
return existing_property.id, False return existing_property.id, False
@ -50,7 +50,7 @@ def create_property(session, portfolio_id: int, address: str, postcode: str) ->
# Add the new property to the session # Add the new property to the session
session.add(new_property) session.add(new_property)
session.commit() session.flush()
return new_property.id, True return new_property.id, True
@ -73,7 +73,7 @@ def create_property_targets(session, property_id: int, portfolio_id: int, epc_ta
heat_demand=heat_demand_target heat_demand=heat_demand_target
) )
session.add(new_target) session.add(new_target)
session.commit() session.flush()
return True return True
@ -93,9 +93,9 @@ def update_property_data(session, property_id: int, portfolio_id: int, property_
existing_property.updated_at = now existing_property.updated_at = now
# Merge the updated property back into the session and commit # Merge the updated property back into the session and flush
session.merge(existing_property) session.merge(existing_property)
session.commit() session.flush()
except NoResultFound: except NoResultFound:
raise Exception(f"Property with property_id {property_id} and portfolio_id {portfolio_id} not found") raise Exception(f"Property with property_id {property_id} and portfolio_id {portfolio_id} not found")
@ -125,6 +125,6 @@ def create_property_details_epc(session, property_details_epc: dict):
new_property_details_epc = PropertyDetailsEpcModel(**property_details_epc) new_property_details_epc = PropertyDetailsEpcModel(**property_details_epc)
session.add(new_property_details_epc) session.add(new_property_details_epc)
session.commit() session.flush()
return True return True

View file

@ -1,5 +1,5 @@
from sqlalchemy import text from sqlalchemy import insert
from backend.app.db.models.recommendations import Plan, Recommendation, RecommendationMaterials from backend.app.db.models.recommendations import Plan, Recommendation, RecommendationMaterials, PlanRecommendations
def create_plan(session, plan): def create_plan(session, plan):
@ -24,7 +24,7 @@ def create_recommendation(session, recommendation):
new_recommendation = Recommendation(**recommendation) new_recommendation = Recommendation(**recommendation)
session.add(new_recommendation) session.add(new_recommendation)
session.commit() session.flush()
return new_recommendation.id return new_recommendation.id
@ -44,25 +44,23 @@ def create_recommendation_material(session, recommendation_id, material_id, dept
depth=depth depth=depth
) )
session.add(new_recommendation_material) session.add(new_recommendation_material)
session.commit() session.flush()
return new_recommendation_material.id return new_recommendation_material.id
def create_plan_recommendations(session, plan_id, recommendation_ids): def create_plan_recommendations(session, plan_id, recommendation_ids):
""" """
This function will create a record for the plan_recommendation in the database if it does not exist. This function will create records for the plan_recommendation in the database.
:param plan_id: ID of the plan :param plan_id: ID of the plan
:param recommendation_ids: list of recommendation IDs :param recommendation_ids: list of recommendation IDs
""" """
for recommendation_id in recommendation_ids: # Prepare a list of dictionaries for bulk insert
session.execute( data = [{"plan_id": plan_id, "recommendation_id": rid} for rid in recommendation_ids]
text(
'INSERT INTO plan_recommendations (plan_id, recommendation_id) VALUES (:plan_id, ' # Bulk insert using SQLAlchemy's core API
':recommendation_id)'), session.execute(insert(PlanRecommendations).values(data))
{'plan_id': plan_id, 'recommendation_id': recommendation_id}
)
def upload_recommendations(session, recommendations_to_upload, property_id): def upload_recommendations(session, recommendations_to_upload, property_id):

View file

@ -14,6 +14,7 @@ from utils.uvalue_estimates import classify_decile_newvalues
from backend.app.db.utils import row2dict from backend.app.db.utils import row2dict
from starlette.responses import Response from starlette.responses import Response
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from sqlalchemy.exc import IntegrityError, OperationalError
# database interaction functions # database interaction functions
from backend.app.db.functions.property_functions import ( from backend.app.db.functions.property_functions import (
@ -135,7 +136,7 @@ async def trigger_plan(body: PlanTriggerRequest):
session = Session() session = Session()
try: try:
session.begin()
logger.info("Getting the inputs") logger.info("Getting the inputs")
# Read in the trigger file from s3 # Read in the trigger file from s3
bucket_name = get_settings().PLAN_TRIGGER_BUCKET bucket_name = get_settings().PLAN_TRIGGER_BUCKET
@ -373,6 +374,18 @@ async def trigger_plan(body: PlanTriggerRequest):
# Commit all changes at once # Commit all changes at once
session.commit() session.commit()
except IntegrityError:
logger.error("Database integrity error occurred", exc_info=True)
session.rollback()
return Response(status_code=500, content="Database integrity error.")
except OperationalError:
logger.error("Database operational error occurred", exc_info=True)
session.rollback()
return Response(status_code=500, content="Database operational error.")
except ValueError:
logger.error("Value error - possibly due to malformed data", exc_info=True)
session.rollback()
return Response(status_code=400, content="Bad request: malformed data.")
except Exception as e: # General exception handling except Exception as e: # General exception handling
logger.error(f"An error occurred: {e}") logger.error(f"An error occurred: {e}")
session.rollback() session.rollback()