From 40d2c5078beb60f0f9cc18d9123adde752440be4 Mon Sep 17 00:00:00 2001 From: carnegiemedal <126577777+carnegiemedal@users.noreply.github.com> Date: Fri, 11 Aug 2023 18:02:22 +0200 Subject: [PATCH 1/6] Update query.py add parameters argument --- src/DatabaseLibrary/query.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index 9c979b7..d28ef6a 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -22,7 +22,7 @@ class Query(object): Query handles all the querying done by the Database Library. """ - def query(self, selectStatement, sansTran=False, returnAsDict=False): + def query(self, selectStatement, sansTran=False, returnAsDict=False, parameters=None): """ Uses the input `selectStatement` to query for the values that will be returned as a list of tuples. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -80,7 +80,7 @@ def query(self, selectStatement, sansTran=False, returnAsDict=False): if not sansTran: self._dbconnection.rollback() - def row_count(self, selectStatement, sansTran=False): + def row_count(self, selectStatement, sansTran=False, parameters=None): """ Uses the input `selectStatement` to query the database and returns the number of rows from the query. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -123,7 +123,7 @@ def row_count(self, selectStatement, sansTran=False): if not sansTran: self._dbconnection.rollback() - def description(self, selectStatement, sansTran=False): + def description(self, selectStatement, sansTran=False, parameters=None): """ Uses the input `selectStatement` to query a table in the db which will be used to determine the description. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -319,7 +319,7 @@ def execute_sql_script(self, sqlScriptFileName, sansTran=False): if not sansTran: self._dbconnection.rollback() - def execute_sql_string(self, sqlString, sansTran=False): + def execute_sql_string(self, sqlString, sansTran=False, parameters=None): """ Executes the sqlString as SQL commands. Useful to pass arguments to your sql. Set optional input `sansTran` to True to run command without an explicit transaction commit or rollback. @@ -484,7 +484,7 @@ def call_stored_procedure(self, spName, spParams=None, sansTran=False): if not sansTran: self._dbconnection.rollback() - def __execute_sql(self, cur, sql_statement, omit_trailing_semicolon=None): + def __execute_sql(self, cur, sql_statement, omit_trailing_semicolon=None, parameters=None): """ Runs the `sql_statement` using `cur` as Cursor object. Use `omit_trailing_semicolon` parameter (bool) for explicite instruction, @@ -496,5 +496,7 @@ def __execute_sql(self, cur, sql_statement, omit_trailing_semicolon=None): omit_trailing_semicolon = self.omit_trailing_semicolon if omit_trailing_semicolon: sql_statement = sql_statement.rstrip(";") + if parameters is None: + parameters = [] logger.debug(f"Executing sql: {sql_statement}") - return cur.execute(sql_statement) + return cur.execute(sql_statement, parameters) From affbfd4e5217cbb85f38366ef2045d455d6834ee Mon Sep 17 00:00:00 2001 From: carnegiemedal <126577777+carnegiemedal@users.noreply.github.com> Date: Fri, 11 Aug 2023 18:15:47 +0200 Subject: [PATCH 2/6] Update query.py pass parameters argument to execute function --- src/DatabaseLibrary/query.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py index d28ef6a..80fa73d 100644 --- a/src/DatabaseLibrary/query.py +++ b/src/DatabaseLibrary/query.py @@ -60,7 +60,7 @@ def query(self, selectStatement, sansTran=False, returnAsDict=False, parameters= try: cur = self._dbconnection.cursor() logger.info('Executing : Query | %s ' % selectStatement) - self.__execute_sql(cur, selectStatement) + self.__execute_sql(cur, selectStatement, parameters=parameters) allRows = cur.fetchall() if returnAsDict: @@ -111,7 +111,7 @@ def row_count(self, selectStatement, sansTran=False, parameters=None): try: cur = self._dbconnection.cursor() logger.info('Executing : Row Count | %s ' % selectStatement) - self.__execute_sql(cur, selectStatement) + self.__execute_sql(cur, selectStatement, parameters=parameters) data = cur.fetchall() if self.db_api_module_name in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]: rowCount = len(data) @@ -148,7 +148,7 @@ def description(self, selectStatement, sansTran=False, parameters=None): try: cur = self._dbconnection.cursor() logger.info('Executing : Description | %s ' % selectStatement) - self.__execute_sql(cur, selectStatement) + self.__execute_sql(cur, selectStatement, parameters=parameters) description = list(cur.description) if sys.version_info[0] < 3: for row in range(0, len(description)): @@ -339,7 +339,7 @@ def execute_sql_string(self, sqlString, sansTran=False, parameters=None): try: cur = self._dbconnection.cursor() logger.info('Executing : Execute SQL String | %s ' % sqlString) - self.__execute_sql(cur, sqlString) + self.__execute_sql(cur, sqlString, parameters=parameters) if not sansTran: self._dbconnection.commit() finally: From baf582c3766143b3d234be9dca80ec836eeba897 Mon Sep 17 00:00:00 2001 From: carnegiemedal <126577777+carnegiemedal@users.noreply.github.com> Date: Fri, 11 Aug 2023 18:32:00 +0200 Subject: [PATCH 3/6] Update basic_tests.robot added test using parameters argument --- test/tests/common_tests/basic_tests.robot | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/tests/common_tests/basic_tests.robot b/test/tests/common_tests/basic_tests.robot index 2fe17bc..2f28772 100644 --- a/test/tests/common_tests/basic_tests.robot +++ b/test/tests/common_tests/basic_tests.robot @@ -16,6 +16,10 @@ SQL Statement Ending With Semicolon Works SQL Statement Ending Without Semicolon Works Query SELECT * FROM person; +SQL Statement With Parameters Works + ${output}= Query SELECT * FROM person WHERE id < ? parameters=[1] + Length Should Be ${output} 1 + Create Person Table [Setup] Log No setup for this test ${output}= Create Person Table From 5e8b2cafd2a69a2447c6c275b4f323f04c4a35d2 Mon Sep 17 00:00:00 2001 From: carnegiemedal <126577777+carnegiemedal@users.noreply.github.com> Date: Fri, 11 Aug 2023 18:55:05 +0200 Subject: [PATCH 4/6] Update basic_tests.robot use correct list parameter --- test/tests/common_tests/basic_tests.robot | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/tests/common_tests/basic_tests.robot b/test/tests/common_tests/basic_tests.robot index 2f28772..386c5ae 100644 --- a/test/tests/common_tests/basic_tests.robot +++ b/test/tests/common_tests/basic_tests.robot @@ -17,7 +17,8 @@ SQL Statement Ending Without Semicolon Works Query SELECT * FROM person; SQL Statement With Parameters Works - ${output}= Query SELECT * FROM person WHERE id < ? parameters=[1] + @{params}= Create List 2 + ${output}= Query SELECT * FROM person WHERE id < ? parameters=${params} Length Should Be ${output} 1 Create Person Table From a992bb09591ce36b6c78116775d240ba8dd35d31 Mon Sep 17 00:00:00 2001 From: carnegiemedal <126577777+carnegiemedal@users.noreply.github.com> Date: Mon, 14 Aug 2023 13:42:47 +0200 Subject: [PATCH 5/6] Update basic_tests.robot try different syntax for postgres, oracle etc. --- test/tests/common_tests/basic_tests.robot | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/tests/common_tests/basic_tests.robot b/test/tests/common_tests/basic_tests.robot index 386c5ae..8f1f28e 100644 --- a/test/tests/common_tests/basic_tests.robot +++ b/test/tests/common_tests/basic_tests.robot @@ -18,7 +18,11 @@ SQL Statement Ending Without Semicolon Works SQL Statement With Parameters Works @{params}= Create List 2 - ${output}= Query SELECT * FROM person WHERE id < ? parameters=${params} + TRY + ${output}= Query SELECT * FROM person WHERE id < ? parameters=${params} + EXCEPT + ${output}= Query SELECT * FROM person WHERE id < :id parameters=${params} + END Length Should Be ${output} 1 Create Person Table From 079e5ba0a55c1b366fae3422db0b46b30f3ac65f Mon Sep 17 00:00:00 2001 From: carnegiemedal <126577777+carnegiemedal@users.noreply.github.com> Date: Mon, 14 Aug 2023 14:09:11 +0200 Subject: [PATCH 6/6] Update basic_tests.robot extra syntax alternative for postgres, pymsql --- test/tests/common_tests/basic_tests.robot | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/tests/common_tests/basic_tests.robot b/test/tests/common_tests/basic_tests.robot index 8f1f28e..4db398c 100644 --- a/test/tests/common_tests/basic_tests.robot +++ b/test/tests/common_tests/basic_tests.robot @@ -18,11 +18,15 @@ SQL Statement Ending Without Semicolon Works SQL Statement With Parameters Works @{params}= Create List 2 - TRY - ${output}= Query SELECT * FROM person WHERE id < ? parameters=${params} - EXCEPT + + IF "${DB_MODULE}" in ["oracledb"] ${output}= Query SELECT * FROM person WHERE id < :id parameters=${params} + ELSE IF "${DB_MODULE}" in ["sqlite3", "pyodbc"] + ${output}= Query SELECT * FROM person WHERE id < ? parameters=${params} + ELSE + ${output}= Query SELECT * FROM person WHERE id < %s parameters=${params} END + Length Should Be ${output} 1 Create Person Table