From 8ed55b1ed9000ad7a5b5b49ff9cd801e197d26da Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Thu, 29 Jun 2023 16:10:37 -0400 Subject: [PATCH] Updates related to SQL and limit and offset --- app/db_sql.py | 18 ++++++++++++++++-- app/routers/api_crud.py | 14 ++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/db_sql.py b/app/db_sql.py index 66da68e..bd7270b 100644 --- a/app/db_sql.py +++ b/app/db_sql.py @@ -520,8 +520,8 @@ def sql_insert_or_update( # ### BEGIN ### Core Help CRUD ### sql_select() ### # The catch all SQL SELECT function - STI 2021-02-17 -# This one does it all for SQL SELECT queries -# Updated 2021-09-07 +# This one does it all for SQL SELECT queries. It now works with limit and offset! - STI 2023-06-29 +# Updated 2023-06-29 @logger_reset def sql_select( table_name: str|None = None, @@ -529,6 +529,8 @@ def sql_select( record_id_random: str|None = None, field_name: str|None = None, field_value = None, + limit: int = 9999999, + offset: int = 0, sql: str|None = None, data: dict|None = None, rm_id_random: bool = False, @@ -539,6 +541,12 @@ def sql_select( ) -> None|bool|dict|list: log.setLevel(log_lvl) + if limit >= 0 and offset >= 0: + log.info(f'Creating partial SQL string for LIMIT and OFFSET. Limit: {limit}; Offset: {offset}') + sql_limit_offset = f'LIMIT {limit} OFFSET {offset}' + else: + sql_limit_offset = '' + if table_name and not (record_id or record_id_random or field_name or field_value or sql or data): # Select all records from a table log.info('Select all records from a table') @@ -546,6 +554,7 @@ def sql_select( f""" SELECT * FROM `{table_name}` + {sql_limit_offset} ; """ ) @@ -561,6 +570,7 @@ def sql_select( SELECT * FROM `{table_name}` WHERE `{table_name}`.id = :record_id + {sql_limit_offset} ; """ ) @@ -572,12 +582,14 @@ def sql_select( SELECT * FROM `{table_name}` WHERE `{table_name}`.id_random = :record_id_random + {sql_limit_offset} ; """ ) elif table_name and field_name and field_value and not (record_id or record_id_random or sql or data): # Select all records from a table with a specific field and field value log.info('Select all records from a table with a specific field and field value') + data = {} data[field_name] = field_value @@ -586,6 +598,7 @@ def sql_select( SELECT * FROM `{table_name}` WHERE `{table_name}`.{field_name} = :{field_name} + {sql_limit_offset} ; """ ) @@ -611,6 +624,7 @@ def sql_select( SELECT * FROM `{table_name}` WHERE {sql_where_string} + {sql_limit_offset} ; """ ) diff --git a/app/routers/api_crud.py b/app/routers/api_crud.py index 571da18..99e8427 100644 --- a/app/routers/api_crud.py +++ b/app/routers/api_crud.py @@ -35,6 +35,7 @@ from app.models.event_presenter_models import * from app.models.event_registration_models import * from app.models.event_session_models import * from app.models.event_track_models import * +from app.models.grant_models import * from app.models.hosted_file_models import * from app.models.journal_models import * from app.models.journal_entry_models import * @@ -98,6 +99,7 @@ obj_type_li['event_presenter'] = {'table_name': 'v_event_presenter', 'tbl_name_u obj_type_li['event_registration'] = {'table_name': 'v_event_registration', 'tbl_name_update': 'event_registration', 'base_name': Event_Registration_Base} obj_type_li['event_session'] = {'table_name': 'v_event_session', 'tbl_name_update': 'event_session', 'base_name': Event_Session_Base, 'exclude_for_db': {'poc_person_id', 'file_count', 'internal_use_count', 'enable_from', 'enable_to', 'event_name', 'event_start_datetime', 'event_end_datetime', 'event_location_name', 'event_track_name', 'event_abstract_list', 'event_badge_list', 'event_device_list', 'event_file_list', 'event_file_internal_use_list', 'event_location', 'event_location_list', 'event_person_list', 'event_presenter_cat', 'event_presentation_list', 'event_presenter_list', 'event_track', 'poc_event_person'}} obj_type_li['event_track'] = {'table_name': 'v_event_track', 'tbl_name_update': 'event_track', 'base_name': Event_Track_Base} +obj_type_li['grant'] = {'table_name': 'v_grant', 'tbl_name_update': 'grant', 'base_name': Grant_Base} obj_type_li['hosted_file'] = {'table_name': 'v_hosted_file', 'tbl_name_update': 'hosted_file', 'base_name': Hosted_File_Base} #obj_type_li['hosted_file_link'] = {'table_name': 'hosted_file_link', 'tbl_name_update': 'hosted_file_link', 'base_name': Hosted_File_Link_Base} obj_type_li['journal'] = {'table_name': 'v_journal', 'tbl_name_update': 'journal', 'base_name': Journal_Base} @@ -170,15 +172,19 @@ async def get_obj_li( #obj_id: str=None, for_obj_type: Optional[str] = Query(None, max_length=50), for_obj_id: Optional[str] = Query(None, max_length=22), + + limit: int = 10000, + offset: int = 0, + x_account_id: str = Header(...), by_alias: Optional[bool] = True, - include: Optional[list] = [], - exclude: Optional[list] = [], + # include: Optional[list] = [], + # exclude: Optional[list] = [], exclude_unset: Optional[bool] = False, exclude_none: Optional[bool] = True, response: Response = Response, ): - log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL + log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) debug_data = {} @@ -221,7 +227,7 @@ async def get_obj_li( #data[f'{for_obj_type}_id'] = for_obj_id field_name = f'{for_obj_type}_id' - sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id) + sql_result = sql_select(table_name=table_name, field_name=field_name, field_value=for_obj_id, limit=limit, offset=offset) else: sql_result = sql_select(table_name=table_name)