Repository: MarketSquare/Robotframework-Database-Library (language: python)

Issue:
[Question] How to log query result to robotframework report?
Hi

Is it possible to enable query log  in Robotframework report with the table header?
Using `Query` keyword only log the result without header


Thanks


Discussion / hints:
Voting up. I would also appreciate getting the SQL query result including the column headers. 
The query results are often hard to read. I believe the best format would be HTML table. It is easy to generate without using external dependencies and it displays well in the RF log. We could add extra param like 'log_results=True' to handle it. There could be additional 'log_head' param to defined how much rows we want to log (ie default max 50, set to 0 to print all). 

Fix patch:
diff --git a/README.md b/README.md
index 6ab6327..f59438a 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ It requires an appropriate **Python module to be installed separately** - depend
 The library consists of some keywords designed to perform different checks on your database.
 Here you can find the [keyword docs](http://marketsquare.github.io/Robotframework-Database-Library/).
 
-Wath the [talk at Robocon 2024 about the Database Library update](https://youtu.be/A96NTUps8sU)
+Wath the [talk at Robocon 2024 about the Database Library update](https://youtu.be/A96NTUps8sU).
 
 [![Talk at Robocon 2024 about the Database Library update](http://img.youtube.com/vi/A96NTUps8sU/0.jpg)](https://youtu.be/A96NTUps8sU)
 
@@ -18,8 +18,7 @@ Wath the [talk at Robocon 2024 about the Database Library update](https://youtu.
 ```
 pip install robotframework-databaselibrary
 ```
-# Usage examples
-## Basic usage
+# Basic usage examples
 ```RobotFramework
 *** Settings ***
 Library       DatabaseLibrary
@@ -29,25 +28,40 @@ Test Setup    Connect To My Oracle DB
 Connect To My Oracle DB
     Connect To Database
     ...    oracledb
-    ...    dbName=db
-    ...    dbUsername=my_user
-    ...    dbPassword=my_pass
-    ...    dbHost=127.0.0.1
-    ...    dbPort=1521
+    ...    db_name=db
+    ...    db_user=my_user
+    ...    db_password=my_pass
+    ...    db_host=127.0.0.1
+    ...    db_port=1521
 
 *** Test Cases ***
+Get All Names
+    ${Rows}=    Query    select FIRST_NAME, LAST_NAME from person
+    Should Be Equal    ${Rows}[0][0]    Franz Allan
+    Should Be Equal    ${Rows}[0][1]    See
+    Should Be Equal    ${Rows}[1][0]    Jerry
+    Should Be Equal    ${Rows}[1][1]    Schneider
+
 Person Table Contains Expected Records
-    ${output}=    Query    select LAST_NAME from person
-    Length Should Be    ${output}    2
-    Should Be Equal    ${output}[0][0]    See
-    Should Be Equal    ${output}[1][0]    Schneider
+    ${sql}=    Catenate    select LAST_NAME from person
+    Check Query Result    ${sql}    contains    See
+    Check Query Result    ${sql}    equals      Schneider    row=1
+
+Wait Until Table Gets New Record
+    ${sql}=    Catenate    select LAST_NAME from person
+    Check Row Count    ${sql}    >    2    retry_timeout=5s
 
 Person Table Contains No Joe
     ${sql}=    Catenate    SELECT id FROM person
-    ...                    WHERE FIRST_NAME= 'Joe'    
-    Check If Not Exists In Database    ${sql}
+    ...                    WHERE FIRST_NAME= 'Joe'
+    Check Row Count    ${sql}   ==    0
 ```
-## Handling multiple database connections
+See more examples in the folder `tests`.
+
+# Handling multiple database connections
+The library can handle multiple connections to different databases using *aliases*.
+An alias is set while creating a connection and can be passed to library keywords in a corresponding argument.
+## Example
 ```RobotFramework
 *** Settings ***
 Library          DatabaseLibrary
@@ -56,9 +70,21 @@ Test Teardown    Disconnect From All Databases
 
 *** Keywords ***
 Connect To All Databases
-    Connect To Database    psycopg2    db    db_user    pass    127.0.0.1    5432
+    Connect To Database
+    ...    psycopg2
+    ...    db_name=db
+    ...    db_user=db_user
+    ...    db_password=pass
+    ...    db_host=127.0.0.1
+    ...    db_port=5432
     ...    alias=postgres
-    Connect To Database    pymysql    db    db_user    pass    127.0.0.1    3306
+    Connect To Database
+    ...    pymysql
+    ...    db_name=db
+    ...    db_user=db_user
+    ...    db_password=pass
+    ...    db_host=127.0.0.1
+    ...    db_port=3306
     ...    alias=mysql
 
 *** Test Cases ***
@@ -73,7 +99,130 @@ Switching Default Alias
     Execute Sql String    drop table XYZ
 ```
 
-See more examples in the folder `tests`.
+
+
+# Using configuration file
+The `Connect To Database` keyword allows providing the connection parameters in two ways:
+- As keyword arguments
+- In a configuration file - a simple list of _key=value_ pairs, set inside an _alias_ section.
+
+You can use only one way or you can combine them:
+- The keyword arguments are taken by default
+- If no keyword argument is provided, a parameter value is searched in the config file
+
+Along with commonly used connection parameters, named exactly as keyword arguments, a config file
+can contain any other DB module specific parameters as key/value pairs.
+If same custom parameter is provided both as a keyword argument *and* in config file,
+the *keyword argument value takes precedence*.
+
+The path to the config file is set by default to `./resources/db.cfg`.
+You can change it using an according parameter in the `Connect To Database` keyword.
+
+A config file *must* contain at least one section name -
+the connection alias, if used (see [Handling multiple database connections](#handling-multiple-database-connections)), or
+`[default]` if no aliases are used.
+
+## Config file examples 
+### Config file with default alias (equal to using no aliases at all)
+```
+[default]
+db_module=psycopg2
+db_name=yourdbname
+db_user=yourusername
+db_password=yourpassword
+db_host=yourhost
+db_port=yourport
+```
+### Config file with a specific alias
+```
+[myoracle]
+db_module=oracledb
+db_name=yourdbname
+db_user=yourusername
+db_password=yourpassword
+db_host=yourhost
+db_port=yourport
+```
+
+### Config file with some params only
+```
+[default]
+db_password=mysecret
+```
+### Config file with some custom DB module specific params
+```
+[default]
+my_custom_param=value
+```
+
+# Inline assertions
+Keywords, that accept arguments ``assertion_operator`` and ``expected_value``,
+perform a check according to the specified condition - using the [Assertion Engine](https://github.com/MarketSquare/AssertionEngine).
+
+## Examples
+```RobotFramework
+Check Row Count     SELECT id FROM person          ==        2
+Check Query Result  SELECT first_name FROM person  contains  Allan
+```
+
+# Retry mechanism
+Assertion keywords, that accept arguments ``retry_timeout`` and ``retry_pause``, support waiting for assertion to pass.
+
+Setting the ``retry_timeout`` argument enables the mechanism -
+in this case the SQL request and the assertion are executed in a loop,
+until the assertion is passed or the ``retry_timeout`` is reached.
+The pause between the loop iterations is set using the ``retry_pause`` argument.
+
+The argument values are set in [Robot Framework time format](http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#time-format) - e.g. ``5 seconds``.
+
+The retry mechanism is disabled by default - ``retry_timeout`` is set to ``0``.
+
+## Examples
+```RobotFramework
+${sql}=   Catenate    SELECT first_name FROM person
+Check Row Count     ${sql}  ==        2      retry_timeout=10 seconds
+Check Query Result  ${sql}  contains  Allan  retry_timeout=5s  retry_pause=1s
+````
+
+# Logging query results
+Keywords, that fetch results of a SQL query, print the result rows as a table in RF log.
+- A log head limit of *50 rows* is applied, other table rows are truncated in the log message.
+- The limit and the logging in general can be adjusted any time in your tests using the Keyword `Set Logging Query Results`.
+
+You can also setup the limit or disable the logging during the library import.
+## Examples
+```RobotFramework
+*** Settings ***
+# Default behavior - logging of query results is enabled, log head is 50 rows.
+Library    DatabaseLibrary
+
+# Logging of query results is disabled, log head is 50 rows (default).
+Library    DatabaseLibrary    log_query_results=False
+
+# Logging of query results is enabled (default), log head is 10 rows.
+Library    DatabaseLibrary    log_query_results_head=10
+
+# Logging of query results is enabled (default), log head limit is disabled (log all rows).
+Library    DatabaseLibrary    log_query_results_head=0
+````
+
+# Commit behavior
+While creating a database connection, the library doesn't explicitly set the _autocommit_ behavior -
+so the default value of the Python DB module is used.
+According to Python DB API specification it should be disabled by default -
+which means each SQL transaction must contain a dedicated commit statement, if necessary.
+
+The library manages it for you:
+- Keywords like `Execute SQL String` perform automatically a commit after running the query - or a rollback in case of error
+- Keywords like `Query` don't perform a commit, but also do a rollback in case of error
+
+You can turn off this automatic commit/rollback behavior using the ``no_transaction`` parameter.
+See docs of a particular keyword.
+
+It's also possible to explicitly set the _autocommit_ behavior on the Python DB module level -
+using the `Set Auto Commit` keyword.
+This has no impact on the automatic commit/rollback behavior in library keywords (described above).
+
 # Database modules compatibility
 The library is basically compatible with any [Python Database API Specification 2.0](https://peps.python.org/pep-0249/) module.
 
@@ -83,7 +232,7 @@ Therefore there are some modules, which are "natively" supported in the library
 ## Python modules currently "natively" supported
 ### Oracle
 - [oracledb](https://oracle.github.io/python-oracledb/)
-    - Both thick and thin client modes are supported - you can select one using the `driverMode` parameter.
+    - Both thick and thin client modes are supported - you can select one using the `oracle_driver_mode` parameter.
     - However, due to current limitations of the oracledb module, **it's not possible to switch between thick and thin modes during a test execution session** - even in different suites.
 - [cx_Oracle](https://oracle.github.io/python-cx_Oracle/)
 ### MySQL
diff --git a/doc/index.html b/doc/index.html
index 3e685f3..f3450a3 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -6,9 +6,9 @@
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Expires" content="-1">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta content="Robot Framework 6.1.1 (Python 3.11.4 on darwin)" name="Generator">
+<meta content="Robot Framework 7.0.1 (Python 3.12.4 on darwin)" name="Generator">
 <link rel="icon" type="image/x-icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqAAAAAAAAAAAAAAAAAAAALIAAAD/AAAA4AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA4AAAAP8AAACxAAAAAAAAAKYAAAD/AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/AAAA/wAAAKkAAAD6AAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN8AAAD/AAAA+gAAAMMAAAAAAAAAAgAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAADAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAIsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANEAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAAAAAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAFAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAADwAAAB8AAAAAAAAAGAAAABcAAAAAAAAAH8AAABKAAAAAAAAAAAAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAADCAAAA/wAAACkAAADqAAAA4QAAAAAAAAD7AAAA/wAAALAAAAAGAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAIwAAAP4AAAD/AAAA/wAAAGAAAAAAAAAAAAAAAMkAAAD/AAAAigAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAAAAAAAIAAAAcAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAA2gAAAP8AAAD7AAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4AAAD/AAAAqwAAAP8AAACvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAD/AAAAsgAAAAAAAAC5AAAA/wAAAMoAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMkAAAD/AAAAvAAAAAAAAAAAAAAAAAAAAKwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArQAAAAAAAAAAwAMAAIABAAAf+AAAP/wAAD/8AAAgBAAAP/wAAD/8AAA//AAAJIwAADHEAAA//AAAP/wAAB/4AACAAQAAwAMAAA==">
-<style media="all" type="text/css">
+<style media="all">
 :root {
     --background-color: white;
     --text-color: black;
@@ -253,6 +253,7 @@
 }
 .arguments-list-container {
     overflow-y: auto;
+    margin-bottom: 1.33rem;
 }
 .arguments-list {
     display: -ms-inline-grid;
@@ -294,7 +295,8 @@
     display: flex;
     min-width: 150px;
 }
-.arguments-list .arg-type {
+.arguments-list .arg-type,
+.return-type .arg-type {
     margin-left: 2rem;
     -ms-grid-column: 3;
     grid-column: 3;
@@ -302,6 +304,10 @@
     white-space: nowrap;
     -webkit-text-size-adjust: none;
 }
+.tags .kw-tags {
+    margin-left: 2rem;
+    display: flex;
+}
 .arguments-list .arg-kind {
   color: transparent;
   text-shadow: 0 0 0 var(--less-important-text-color);
@@ -511,6 +517,7 @@
 }
 .enum-type-members span,
 .args span,
+.return-type span,
 .args a
  {
     font-family: monospace;
@@ -546,7 +553,7 @@
     background: var(--highlighted-background-color);
     color: var(--highlighted-color);
 }
-.tags {
+.tags, .return-type {
     display: flex;
     align-items: baseline;
 }
@@ -651,7 +658,7 @@
     display: none;
 }
 </style>
-<style media="all" type="text/css">
+<style media="all">
 /* Pygments 'default' style sheet. Generated with Pygments 2.1.3 using:
     pygmentize -S default -f html -a .code > src/robot/htmldata/libdoc/pygments.css
     and added for dark mode
@@ -808,7 +815,7 @@
     .code .il { color: #2aa198 } /* Literal.Number.Integer.Long */
 }
 </style>
-<style media="print" type="text/css">
+<style media="print">
 body {
     margin: 0;
     padding: 0;
@@ -821,7 +828,7 @@
     display: none;
 }
 </style>
-<style media="all" type="text/css">
+<style media="all">
 #javascript-disabled {
     width: 600px;
     margin: 100px auto 0 auto;
@@ -844,7 +851,7 @@
     font-style: italic;
 }
 </style>
-<style media="all" type="text/css">
+<style media="all">
 #introduction-container > h2,
 .doc > h1,
 .doc > h2,
@@ -921,7 +928,8 @@
     var prefix = 'robot-framework-';
     var storage;
     function init(user) {
-        prefix += user + '-';
+        if (user)
+            prefix += user + '-';
         storage = getStorage();
     }
     function getStorage() {
@@ -935,16 +943,19 @@
             return {};
         }
     }
-    function get(name, defaultValue) {
-        var value = storage[prefix + name];
+    function get(key, defaultValue) {
+        var value = storage[fullKey(key)];
         if (typeof value === 'undefined')
             return defaultValue;
         return value;
     }
-    function set(name, value) {
-        storage[prefix + name] = value;
+    function set(key, value) {
+        storage[fullKey(key)] = value;
     }
-    return {init: init, get: get, set: set};
+    function fullKey(key) {
+        return prefix + key;
+    }
+    return {init: init, get: get, set: set, fullKey: fullKey};
 }();
 </script>
 <script type="text/javascript">
@@ -1180,7 +1191,7 @@
 jQuery.extend({highlight:function(e,t,n,r){if(e.nodeType===3){var i=e.data.match(t);if(i){var s=document.createElement(n||"span");s.className=r||"highlight";var o=e.splitText(i.index);o.splitText(i[0].length);var u=o.cloneNode(true);s.appendChild(u);o.parentNode.replaceChild(s,o);return 1}}else if(e.nodeType===1&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&!(e.tagName===n.toUpperCase()&&e.className===r)){for(var a=0;a<e.childNodes.length;a++){a+=jQuery.highlight(e.childNodes[a],t,n,r)}}return 0}});jQuery.fn.unhighlight=function(e){var t={className:"highlight",element:"span"};jQuery.extend(t,e);return this.find(t.element+"."+t.className).each(function(){var e=this.parentNode;e.replaceChild(this.firstChild,this);e.normalize()}).end()};jQuery.fn.highlight=function(e,t){var n={className:"highlight",element:"span",caseSensitive:false,wordsOnly:false};jQuery.extend(n,t);if(e.constructor===String){e=[e]}e=jQuery.grep(e,function(e,t){return e!=""});e=jQuery.map(e,function(e,t){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")});if(e.length==0){return this}var r=n.caseSensitive?"":"i";var i="("+e.join("|")+")";if(n.wordsOnly){i="\\b"+i+"\\b"}var s=new RegExp(i,r);return this.each(function(){jQuery.highlight(this,s,n.element,n.className)})}
 </script>
 <script type="text/javascript">
-libdoc = {"specversion": 2, "name": "DatabaseLibrary", "doc": "<p>The Database Library for <a href=\"https://robotframework.org\">Robot Framework</a> allows you to query a database and verify the results. It requires an appropriate <b>Python module to be installed separately</b> - depending on your database, like e.g. <span class=\"name\">oracledb</span> or <span class=\"name\">pymysql</span>.</p>\n<h3 id=\"Requirements\">Requirements</h3>\n<ul>\n<li>Python</li>\n<li>Robot Framework</li>\n<li>Python database module you're going to use - e.g. <span class=\"name\">oracledb</span></li>\n</ul>\n<h3 id=\"Installation\">Installation</h3>\n<pre>\npip install robotframework-databaselibrary\n</pre>\n<p>Don't forget to install the required Python database module!</p>\n<h3 id=\"Usage example\">Usage example</h3>\n<h4 id=\"Basic usage\">Basic usage</h4>\n<pre>\n<b>*</b> Settings <b>*</b>\nLibrary       DatabaseLibrary\nTest Setup    Connect To My Oracle DB\n\n<b>*</b> Keywords <b>*</b>\nConnect To My Oracle DB\n    Connect To Database\n    ...    oracledb\n    ...    dbName=db\n    ...    dbUsername=my_user\n    ...    dbPassword=my_pass\n    ...    dbHost=127.0.0.1\n    ...    dbPort=1521\n\n<b>*</b> Test Cases <b>*</b>\nPerson Table Contains Expected Records\n    ${output}=    Query    select LAST_NAME from person\n    Length Should Be    ${output}    2\n    Should Be Equal    ${output}[0][0]    See\n    Should Be Equal    ${output}[1][0]    Schneider\n\nPerson Table Contains No Joe\n    ${sql}=    Catenate    SELECT id FROM person\n    ...                    WHERE FIRST_NAME= 'Joe'\n    Check If Not Exists In Database    ${sql}\n\n</pre>\n<h4 id=\"Handling multiple database connections\">Handling multiple database connections</h4>\n<pre>\n<b>*</b> Settings <b>*</b>\nLibrary          DatabaseLibrary\nTest Setup       Connect To All Databases\nTest Teardown    Disconnect From All Databases\n\n<b>*</b> Keywords <b>*</b>\nConnect To All Databases\n    Connect To Database    psycopg2    db    db_user    pass    127.0.0.1    5432\n    ...    alias=postgres\n    Connect To Database    pymysql    db    db_user    pass    127.0.0.1    3306\n    ...    alias=mysql\n\n<b>*</b> Test Cases <b>*</b>\nUsing Aliases\n    ${names}=    Query    select LAST_NAME from person    alias=postgres\n    Execute Sql String    drop table XYZ                  alias=mysql\n\nSwitching Default Alias\n    Switch Database    postgres\n    ${names}=    Query    select LAST_NAME from person\n    Switch Database    mysql\n    Execute Sql String    drop table XYZ\n\n</pre>\n<h3 id=\"Database modules compatibility\">Database modules compatibility</h3>\n<p>The library is basically compatible with any <a href=\"https://peps.python.org/pep-0249\">Python Database API Specification 2.0</a> module.</p>\n<p>However, the actual implementation in existing Python modules is sometimes quite different, which requires custom handling in the library. Therefore, there are some modules, which are \"natively\" supported in the library - and others, which may work and may not.</p>\n<p>See more on the <a href=\"https://github.com/MarketSquare/Robotframework-Database-Library\">project page on GitHub</a>.</p>", "version": "1.4.3", "generated": "2023-12-19T20:25:22+00:00", "type": "LIBRARY", "scope": "GLOBAL", "docFormat": "HTML", "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/__init__.py", "lineno": 25, "tags": [], "inits": [], "keywords": [{"name": "Call Stored Procedure", "args": [{"name": "spName", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "spName: str"}, {"name": "spParams", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List[str]", "None"], "typedocs": {"List": "list", "str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "spParams: List[str] | None = None"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}], "doc": "<p>Calls a stored procedure <span class=\"name\">spName</span> with the <span class=\"name\">spParams</span> - a <b>list</b> of parameters the procedure requires. Use the special <b>CURSOR</b> value for OUT params, which should receive result sets - they will be converted to appropriate DB variables before calling the procedure. This is necessary only for some databases (e.g. Oracle or PostgreSQL).</p>\n<p>The keywords always <b>returns two lists</b>:</p>\n<ul>\n<li><b>Param values</b> - the copy of procedure parameters (modified, if the procedure changes the OUT params).</li>\n</ul>\n<p>The list is empty, if procedures receives no params.</p>\n<ul>\n<li><b>Result sets</b> - the list of lists, each of them containing results of some query, if the procedure</li>\n</ul>\n<p>returns them or put them in the OUT params of type <b>CURSOR</b> (like in Oracle or PostgreSQL).</p>\n<p>It also depends on the database, how the procedure returns the values - as params or as result sets. E.g. calling a procedure in <b>PostgreSQL</b> returns even a single value of an OUT param as a result set.</p>\n<p>Simple example:</p>\n<table border=\"1\">\n<tr>\n<td>@{Params} =</td>\n<td>Create List</td>\n<td>Jerry</td>\n<td>out_second_name</td>\n</tr>\n<tr>\n<td>@{Param values}    @{Result sets} =</td>\n<td>Call Stored Procedure</td>\n<td>Get_second_name</td>\n<td>${Params}</td>\n</tr>\n<tr>\n<td># ${Param values} = ['Jerry', 'Schneider']</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td># ${result sets} = []</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n</table>\n<p>Example with a single CURSOR parameter (Oracle DB):</p>\n<table border=\"1\">\n<tr>\n<td>@{Params} =</td>\n<td>Create List</td>\n<td>CURSOR</td>\n<td></td>\n</tr>\n<tr>\n<td>@{Param values}    @{Result sets} =</td>\n<td>Call Stored Procedure</td>\n<td>Get_all_second_names</td>\n<td>${Params}</td>\n</tr>\n<tr>\n<td># ${Param values} = [&lt;oracledb.Cursor on &lt;oracledb.Connection ...&gt;&gt;]</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td># ${result sets} = [[('See',), ('Schneider',)]]</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n</table>\n<p>Example with multiple CURSOR parameters (Oracle DB):</p>\n<table border=\"1\">\n<tr>\n<td>@{Params} =</td>\n<td>Create List</td>\n<td>CURSOR</td>\n<td>CURSOR</td>\n</tr>\n<tr>\n<td>@{Param values}    @{Result sets} =</td>\n<td>Call Stored Procedure</td>\n<td>Get_all_first_and_second_names</td>\n<td>${Params}</td>\n</tr>\n<tr>\n<td># ${Param values} = [&lt;oracledb.Cursor on &lt;oracledb.Connection ...&gt;&gt;, &lt;oracledb.Cursor on &lt;oracledb.Connection ...&gt;&gt;]</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td># ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n</table>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <span class=\"name\">sansTran</span> to run command without an explicit transaction commit or rollback:</p>\n<table border=\"1\">\n<tr>\n<td>@{Param values}    @{Result sets} =</td>\n<td>Call Stored Procedure</td>\n<td>DBName.SchemaName.StoredProcName</td>\n<td>${Params}</td>\n<td>True</td>\n</tr>\n</table>", "shortdoc": "Calls a stored procedure `spName` with the `spParams` - a *list* of parameters the procedure requires. Use the special *CURSOR* value for OUT params, which should receive result sets - they will be converted to appropriate DB variables before calling the procedure. This is necessary only for some databases (e.g. Oracle or PostgreSQL).", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 407}, {"name": "Check If Exists In Database", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Check if any row would be returned by given the input <code>selectStatement</code>. If there are no results, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td></td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Check if any row would be returned by given the input ``selectStatement``. If there are no results, then this will throw an AssertionError.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 24}, {"name": "Check If Not Exists In Database", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>This is the negation of <span class=\"name\">check_if_exists_in_database</span>.</p>\n<p>Check if no rows would be returned by given the input <code>selectStatement</code>. If there are any results, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td></td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "This is the negation of `check_if_exists_in_database`.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 61}, {"name": "Connect To Database", "args": [{"name": "dbapiModuleName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbapiModuleName: str | None = None"}, {"name": "dbName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbName: str | None = None"}, {"name": "dbUsername", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbUsername: str | None = None"}, {"name": "dbPassword", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbPassword: str | None = None"}, {"name": "dbHost", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbHost: str | None = None"}, {"name": "dbPort", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "int", "typedoc": "integer", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["int", "None"], "typedocs": {"int": "integer", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbPort: int | None = None"}, {"name": "dbCharset", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbCharset: str | None = None"}, {"name": "dbDriver", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbDriver: str | None = None"}, {"name": "dbConfigFile", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbConfigFile: str | None = None"}, {"name": "driverMode", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "driverMode: str | None = None"}, {"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": "default", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str = default"}], "doc": "<p>Loads the DB API 2.0 module given <code>dbapiModuleName</code> then uses it to connect to the database using provided parameters such as <code>dbName</code>, <code>dbUsername</code>, and <code>dbPassword</code>.</p>\n<p>Optional <code>alias</code> parameter can be used for creating multiple open connections, even for different databases. If the same alias is given twice then previous connection will be overriden.</p>\n<p>The <code>driverMode</code> is used to select the <b>oracledb</b> client mode. Allowed values are:</p>\n<ul>\n<li><i>thin</i> (default if omitted)</li>\n<li><i>thick</i></li>\n<li><i>thick,lib_dir=&lt;PATH_TO_ORACLE_CLIENT&gt;</i></li>\n</ul>\n<p>Optionally, you can specify a <code>dbConfigFile</code> wherein it will load the alias (or alias will be \"default\") property values for <code>dbapiModuleName</code>, <code>dbName</code> <code>dbUsername</code> and <code>dbPassword</code> (note: specifying <code>dbapiModuleName</code>, <code>dbName</code> <span class=\"name\">dbUsername</span> or <span class=\"name\">dbPassword</span> directly will override the properties of the same key in <span class=\"name\">dbConfigFile</span>). If no <span class=\"name\">dbConfigFile</span> is specified, it defaults to <span class=\"name\">./resources/db.cfg</span>.</p>\n<p>The <span class=\"name\">dbConfigFile</span> is useful if you don't want to check into your SCM your database credentials.</p>\n<p>Example db.cfg file</p>\n<pre>\n[alias]\ndbapiModuleName=pymysqlforexample\ndbName=yourdbname\ndbUsername=yourusername\ndbPassword=yourpassword\ndbHost=yourhost\ndbPort=yourport\n</pre>\n<p>Example usage:</p>\n<table border=\"1\">\n<tr>\n<td># explicitly specifies all db property values</td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db</td>\n<td>postgres</td>\n<td>s3cr3t</td>\n<td>tiger.foobar.com</td>\n<td>5432</td>\n<td></td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db</td>\n<td>postgres</td>\n<td>s3cr3t</td>\n<td>tiger.foobar.com</td>\n<td>5432</td>\n<td>alias=my_alias</td>\n</tr>\n</table>\n<table border=\"1\">\n<tr>\n<td># loads all property values from default.cfg</td>\n<td></td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>dbConfigFile=default.cfg</td>\n</tr>\n</table>\n<table border=\"1\">\n<tr>\n<td># loads all property values from ./resources/db.cfg</td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n</tr>\n</table>\n<table border=\"1\">\n<tr>\n<td># uses explicit <span class=\"name\">dbapiModuleName</span> and <span class=\"name\">dbName</span> but uses the <span class=\"name\">dbUsername</span> and <span class=\"name\">dbPassword</span> in 'default.cfg'</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db_test</td>\n<td>dbConfigFile=default.cfg</td>\n</tr>\n</table>\n<table border=\"1\">\n<tr>\n<td># uses explicit <span class=\"name\">dbapiModuleName</span> and <span class=\"name\">dbName</span> but uses the <span class=\"name\">dbUsername</span> and <span class=\"name\">dbPassword</span> in './resources/db.cfg'</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db_test</td>\n</tr>\n</table>", "shortdoc": "Loads the DB API 2.0 module given ``dbapiModuleName`` then uses it to connect to the database using provided parameters such as ``dbName``, ``dbUsername``, and ``dbPassword``.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 119}, {"name": "Connect To Database Using Custom Connection String", "args": [{"name": "dbapiModuleName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbapiModuleName: str | None = None"}, {"name": "db_connect_string", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": "", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_connect_string: str = "}, {"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": "default", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str = default"}], "doc": "<p>Loads the DB API 2.0 module given <span class=\"name\">dbapiModuleName</span> then uses it to connect to the database using the <span class=\"name\">db_connect_string</span> (parsed as single connection string or URI).</p>\n<p>Use <span class=\"name\">connect_to_database_using_custom_params</span> for passing connection params as named arguments.</p>\n<p>Example usage:</p>\n<table border=\"1\">\n<tr>\n<td>Connect To Database Using Custom Connection String</td>\n<td>psycopg2</td>\n<td><a href=\"postgresql://postgres:s3cr3t@tiger.foobar.com:5432/my_db_test\">postgresql://postgres:s3cr3t@tiger.foobar.com:5432/my_db_test</a></td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Connection String</td>\n<td>oracledb</td>\n<td>username/pass@localhost:1521/orclpdb</td>\n</tr>\n</table>", "shortdoc": "Loads the DB API 2.0 module given `dbapiModuleName` then uses it to connect to the database using the `db_connect_string` (parsed as single connection string or URI).", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 386}, {"name": "Connect To Database Using Custom Params", "args": [{"name": "dbapiModuleName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "dbapiModuleName: str | None = None"}, {"name": "db_connect_string", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": "", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_connect_string: str = "}, {"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": "default", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str = default"}], "doc": "<p>Loads the DB API 2.0 module given <span class=\"name\">dbapiModuleName</span> then uses it to connect to the database using the map string <span class=\"name\">db_connect_string</span> (parsed as a list of named arguments).</p>\n<p>Use <span class=\"name\">connect_to_database_using_custom_connection_string</span> for passing all params in a single connection string or URI.</p>\n<p>Example usage:</p>\n<table border=\"1\">\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>psycopg2</td>\n<td>database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432</td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>jaydebeapi</td>\n<td>'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t'</td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>oracledb</td>\n<td>user=\"username\", password=\"pass\", dsn=\"localhost/orclpdb\"</td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>sqlite3</td>\n<td>database=\"./my_database.db\", isolation_level=None</td>\n</tr>\n</table>", "shortdoc": "Loads the DB API 2.0 module given `dbapiModuleName` then uses it to connect to the database using the map string `db_connect_string` (parsed as a list of named arguments).", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 348}, {"name": "Delete All Rows From Table", "args": [{"name": "tableName", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "tableName: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}], "doc": "<p>Delete all the rows within a given table.</p>\n<p>Use optional <span class=\"name\">sansTran</span> to run command without an explicit transaction commit or rollback.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Delete All Rows From Table</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>Delete All Rows From Table</td>\n<td>person</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Delete All Rows From Table</td>\n<td>person</td>\n<td>sansTran=True</td>\n</tr>\n</table>", "shortdoc": "Delete all the rows within a given table.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 185}, {"name": "Description", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Uses the input <code>selectStatement</code> to query a table in the db which will be used to determine the description.</p>\n<p>For example, given we have a table <span class=\"name\">person</span> with the following data:</p>\n<table border=\"1\">\n<tr>\n<td>id</td>\n<td>first_name</td>\n<td>last_name</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Franz Allan</td>\n<td>See</td>\n</tr>\n</table>\n<p>When you do the following:</p>\n<table border=\"1\">\n<tr>\n<td>@{queryResults}</td>\n<td>Description</td>\n<td>SELECT * FROM person</td>\n<td></td>\n</tr>\n<tr>\n<td>@{queryResults}</td>\n<td>Description</td>\n<td>SELECT * FROM person</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Log Many</td>\n<td>@{queryResults}</td>\n<td></td>\n<td></td>\n</tr>\n</table>\n<p>You will get the following: [Column(name='id', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)] [Column(name='first_name', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)] [Column(name='last_name', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)]</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client):</p>\n<table border=\"1\">\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>${desc}</td>\n<td>Description</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>\n<p>Using optional <span class=\"name\">sansTran</span> to run command without an explicit transaction commit or rollback:</p>\n<table border=\"1\">\n<tr>\n<td>@{queryResults}</td>\n<td>Description</td>\n<td>SELECT * FROM person</td>\n<td>True</td>\n</tr>\n</table>", "shortdoc": "Uses the input ``selectStatement`` to query a table in the db which will be used to determine the description.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 135}, {"name": "Disconnect From All Databases", "args": [], "doc": "<p>Disconnects from all the databases - useful when testing with multiple database connections (aliases).</p>\n<p>For example:</p>\n<table border=\"1\">\n<tr>\n<td>Disconnect From All Databases</td>\n<td># Closes connections to all databases</td>\n</tr>\n</table>", "shortdoc": "Disconnects from all the databases - useful when testing with multiple database connections (aliases).", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 432}, {"name": "Disconnect From Database", "args": [{"name": "error_if_no_connection", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "error_if_no_connection: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}], "doc": "<p>Disconnects from the database.</p>\n<p>By default, it's not an error if there was no open database connection - suitable for usage as a teardown. However, you can enforce it using the <span class=\"name\">error_if_no_connection</span> parameter.</p>\n<p>Example usage:</p>\n<table border=\"1\">\n<tr>\n<td>Disconnect From Database</td>\n<td># disconnects from current connection to the database</td>\n<td></td>\n</tr>\n<tr>\n<td>Disconnect From Database</td>\n<td>alias=my_alias</td>\n<td># disconnects from current connection to the database</td>\n</tr>\n</table>", "shortdoc": "Disconnects from the database.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 410}, {"name": "Execute Sql Script", "args": [{"name": "sqlScriptFileName", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "sqlScriptFileName: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "split", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "True", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "split: bool = True"}], "doc": "<p>Executes the content of the <span class=\"name\">sqlScriptFileName</span> as SQL commands. Useful for setting the database to a known state before running your tests, or clearing out your test data after running each a test.</p>\n<p>SQL commands are expected to be delimited by a semicolon (';') - they will be split and executed separately. You can disable this behaviour setting the parameter <span class=\"name\">split</span> to <i>False</i> - in this case the entire script content will be passed to the database module for execution.</p>\n<p>Sample usage :</p>\n<table border=\"1\">\n<tr>\n<td>Execute Sql Script</td>\n<td>${EXECDIR}${/}resources${/}DDL-setup.sql</td>\n<td></td>\n</tr>\n<tr>\n<td>Execute Sql Script</td>\n<td>${EXECDIR}${/}resources${/}DML-setup.sql</td>\n<td></td>\n</tr>\n<tr>\n<td>Execute Sql Script</td>\n<td>${EXECDIR}${/}resources${/}DDL-setup.sql</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>#interesting stuff here</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Execute Sql Script</td>\n<td>${EXECDIR}${/}resources${/}DML-teardown.sql</td>\n<td></td>\n</tr>\n<tr>\n<td>Execute Sql Script</td>\n<td>${EXECDIR}${/}resources${/}DDL-teardown.sql</td>\n<td></td>\n</tr>\n</table>\n<p>For example: DELETE FROM person_employee_table; DELETE FROM person_table; DELETE FROM employee_table;</p>\n<p>Also, the last SQL command can optionally omit its trailing semi-colon.</p>\n<p>For example: DELETE FROM person_employee_table; DELETE FROM person_table; DELETE FROM employee_table</p>\n<p>Given this, that means you can create spread your SQL commands in several lines.</p>\n<p>For example: DELETE FROM person_employee_table; DELETE FROM person_table; DELETE FROM employee_table</p>\n<p>However, lines that starts with a number sign (<span class=\"name\">#</span>) or a double dash (\"--\") are treated as a commented line. Thus, none of the contents of that line will be executed.</p>\n<p>For example: # Delete the bridging table first... DELETE FROM person_employee_table; # ...and then the bridged tables. DELETE FROM person_table; DELETE FROM employee_table</p>\n<p>The slash signs (\"/\") are always ignored and have no impact on execution order.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <span class=\"name\">sansTran</span> to run command without an explicit transaction commit or rollback:</p>\n<table border=\"1\">\n<tr>\n<td>Execute Sql Script</td>\n<td>${EXECDIR}${/}resources${/}DDL-setup.sql</td>\n<td>True</td>\n</tr>\n</table>", "shortdoc": "Executes the content of the `sqlScriptFileName` as SQL commands. Useful for setting the database to a known state before running your tests, or clearing out your test data after running each a test.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 216}, {"name": "Execute Sql String", "args": [{"name": "sqlString", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "sqlString: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}, {"name": "omitTrailingSemicolon", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["bool", "None"], "typedocs": {"bool": "boolean", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "omitTrailingSemicolon: bool | None = None"}], "doc": "<p>Executes the <code>sqlString</code> as a single SQL command.</p>\n<p>Use optional <code>sansTran</code> to run command without an explicit transaction commit or rollback.</p>\n<p>Use optional <code>omitTrailingSemicolon</code> parameter for explicit instruction, if the trailing semicolon (;) at the SQL string end should be removed or not:</p>\n<ul>\n<li>Some database modules (e.g. Oracle) throw an exception, if you leave a semicolon at the string end</li>\n<li>However, there are exceptional cases, when you need it even for Oracle - e.g. at the end of a PL/SQL block.</li>\n<li>If not specified, it's decided based on the current database module in use. For Oracle, the semicolon is removed by default.</li>\n</ul>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>For example:</p>\n<table border=\"1\">\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM person_employee_table; DELETE FROM person_table</td>\n<td></td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM person_employee_table; DELETE FROM person_table</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM person_employee_table; DELETE FROM person_table</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>CREATE PROCEDURE proc AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello!'); END;</td>\n<td>omitTrailingSemicolon=False</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person_employee_table</td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Executes the ``sqlString`` as a single SQL command.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 362}, {"name": "Query", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "returnAsDict", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "returnAsDict: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Runs a query with the <code>selectStatement</code> and returns the result as a list of rows. The type of row values depends on the database module - usually they are tuples or tuple-like objects.</p>\n<p>Set optional input <code>returnAsDict</code> to <i>True</i> to explicitely convert the return values into a list of dictionaries.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client):</p>\n<table border=\"1\">\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person</td>\n</tr>\n<tr>\n<td>Query</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>\n<p>Use optional <code>sansTran</code> to run command without an explicit transaction commit or rollback:</p>\n<table border=\"1\">\n<tr>\n<td>@{queryResults}</td>\n<td>Query</td>\n<td>SELECT * FROM person</td>\n<td>True</td>\n</tr>\n</table>\n<p>Tip: Unless you want to log all column values of the specified rows, try specifying the column names in your select statements as much as possible to prevent any unnecessary surprises with schema changes and to easily see what your [] indexing is trying to retrieve (i.e. instead of <span class=\"name\">\"select * from my_table\"</span>, try <span class=\"name\">\"select id, col_1, col_2 from my_table\"</span>).</p>\n<p>For example, given we have a table <span class=\"name\">person</span> with the following data:</p>\n<table border=\"1\">\n<tr>\n<td>id</td>\n<td>first_name</td>\n<td>last_name</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Franz Allan</td>\n<td>See</td>\n</tr>\n</table>\n<p>When you do the following:</p>\n<table border=\"1\">\n<tr>\n<td>@{queryResults}</td>\n<td>Query</td>\n<td>SELECT * FROM person</td>\n<td></td>\n</tr>\n<tr>\n<td>@{queryResults}</td>\n<td>Query</td>\n<td>SELECT * FROM person</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Log Many</td>\n<td>@{queryResults}</td>\n<td></td>\n<td></td>\n</tr>\n</table>\n<p>You will get the following: [1, 'Franz Allan', 'See']</p>\n<p>Also, you can do something like this:</p>\n<table border=\"1\">\n<tr>\n<td>${queryResults}</td>\n<td>Query</td>\n<td>SELECT first_name, last_name FROM person</td>\n</tr>\n<tr>\n<td>Log</td>\n<td>${queryResults[0][1]}, ${queryResults[0][0]}</td>\n<td></td>\n</tr>\n</table>\n<p>And get the following See, Franz Allan</p>", "shortdoc": "Runs a query with the ``selectStatement`` and returns the result as a list of rows. The type of row values depends on the database module - usually they are tuples or tuple-like objects.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 28}, {"name": "Row Count", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Uses the input <code>selectStatement</code> to query the database and returns the number of rows from the query.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>sansTran</code> to run command without an explicit transaction commit or rollback:</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client):</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>${rowCount}</td>\n<td>Row Count</td>\n<td>SELECT * FROM person</td>\n<td></td>\n</tr>\n<tr>\n<td>${rowCount}</td>\n<td>Row Count</td>\n<td>SELECT * FROM person</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>${rowCount}</td>\n<td>Row Count</td>\n<td>SELECT * FROM person</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>${rowCount}</td>\n<td>Row Count</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Uses the input ``selectStatement`` to query the database and returns the number of rows from the query.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 96}, {"name": "Row Count Is 0", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Check if any rows are returned from the submitted <code>selectStatement</code>. If there are, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Check if any rows are returned from the submitted ``selectStatement``. If there are, then this will throw an AssertionError.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 100}, {"name": "Row Count Is Equal To X", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "numRows", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "numRows: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Check if the number of rows returned from <code>selectStatement</code> is equal to the value submitted. If not, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person</td>\n<td>1</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person</td>\n<td>3</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>0</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Check if the number of rows returned from ``selectStatement`` is equal to the value submitted. If not, then this will throw an AssertionError.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 136}, {"name": "Row Count Is Greater Than X", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "numRows", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "numRows: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Check if the number of rows returned from <code>selectStatement</code> is greater than the value submitted. If not, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person</td>\n<td>1</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>0</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Check if the number of rows returned from ``selectStatement`` is greater than the value submitted. If not, then this will throw an AssertionError.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 174}, {"name": "Row Count Is Less Than X", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "numRows", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "numRows: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["List", "None"], "typedocs": {"List": "list", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: List | None = None"}], "doc": "<p>Check if the number of rows returned from <code>selectStatement</code> is less than the value submitted. If not, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>Using optional <code>msg</code> to override the default error message:</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use optional <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>1</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>2</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>3</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>4</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>5</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Check if the number of rows returned from ``selectStatement`` is less than the value submitted. If not, then this will throw an AssertionError.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 212}, {"name": "Set Auto Commit", "args": [{"name": "autoCommit", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "True", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "autoCommit: bool = True"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}], "doc": "<p>Turn the autocommit on the database connection ON or OFF.</p>\n<p>The default behaviour on a newly created database connection is to automatically start a transaction, which means that database actions that won't work if there is an active transaction will fail. Common examples of these actions are creating or deleting a database or database snapshot. By turning on auto commit on the database connection these actions can be performed.</p>\n<p>Example usage:</p>\n<pre>\n# Default behaviour, sets auto commit to true\nSet Auto Commit\nSet Auto Commit | alias=my_alias |\n# Explicitly set the desired state\nSet Auto Commit | False\n</pre>", "shortdoc": "Turn the autocommit on the database connection ON or OFF.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 445}, {"name": "Switch Database", "args": [{"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias: str"}], "doc": "<p>Switch the default database connection to <code>alias</code>.</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Switch Database</td>\n<td>my_alias</td>\n</tr>\n<tr>\n<td>Switch Database</td>\n<td>alias=my_alias</td>\n</tr>\n</table>", "shortdoc": "Switch the default database connection to ``alias``.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 466}, {"name": "Table Must Exist", "args": [{"name": "tableName", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "types": ["str"], "typedocs": {"str": "string"}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "tableName: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "types": ["bool"], "typedocs": {"bool": "boolean"}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "types": ["str", "None"], "typedocs": {"str": "string", "None": "None"}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}], "doc": "<p>Check if the given table exists in the database.</p>\n<p>Set optional input <code>sansTran</code> to True to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td>sansTran=True</td>\n</tr>\n</table>", "shortdoc": "Check if the given table exists in the database.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 250}], "dataTypes": {"enums": [], "typedDicts": []}, "typedocs": [{"type": "Standard", "name": "boolean", "doc": "<p>Strings <code>TRUE</code>, <code>YES</code>, <code>ON</code> and <code>1</code> are converted to Boolean <code>True</code>, the empty string as well as strings <code>FALSE</code>, <code>NO</code>, <code>OFF</code> and <code>0</code> are converted to Boolean <code>False</code>, and the string <code>NONE</code> is converted to the Python <code>None</code> object. Other strings and other accepted values are passed as-is, allowing keywords to handle them specially if needed. All string comparisons are case-insensitive.</p>\n<p>Examples: <code>TRUE</code> (converted to <code>True</code>), <code>off</code> (converted to <code>False</code>), <code>example</code> (used as-is)</p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Delete All Rows From Table", "Description", "Disconnect From Database", "Execute Sql Script", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X", "Set Auto Commit", "Table Must Exist"], "accepts": ["string", "integer", "float", "None"]}, {"type": "Standard", "name": "integer", "doc": "<p>Conversion is done using Python's <a href=\"https://docs.python.org/library/functions.html#int\">int</a> built-in function. Floating point numbers are accepted only if they can be represented as integers exactly. For example, <code>1.0</code> is accepted and <code>1.1</code> is not.</p>\n<p>Starting from RF 4.1, it is possible to use hexadecimal, octal and binary numbers by prefixing values with <code>0x</code>, <code>0o</code> and <code>0b</code>, respectively.</p>\n<p>Starting from RF 4.1, spaces and underscores can be used as visual separators for digit grouping purposes.</p>\n<p>Examples: <code>42</code>, <code>-1</code>, <code>0b1010</code>, <code>10 000 000</code>, <code>0xBAD_C0FFEE</code></p>", "usages": ["Connect To Database"], "accepts": ["string", "float"]}, {"type": "Standard", "name": "list", "doc": "<p>Strings must be Python <a href=\"https://docs.python.org/library/stdtypes.html#list\">list</a> literals. They are converted to actual lists using the <a href=\"https://docs.python.org/library/ast.html#ast.literal_eval\">ast.literal_eval</a> function. They can contain any values <code>ast.literal_eval</code> supports, including lists and other containers.</p>\n<p>If the type has nested types like <code>list[int]</code>, items are converted to those types automatically. This in new in Robot Framework 6.0.</p>\n<p>Examples: <code>['one', 'two']</code>, <code>[('one', 1), ('two', 2)]</code></p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Description", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X"], "accepts": ["string", "Sequence"]}, {"type": "Standard", "name": "None", "doc": "<p>String <code>NONE</code> (case-insensitive) is converted to Python <code>None</code> object. Other values cause an error.</p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Connect To Database", "Connect To Database Using Custom Connection String", "Connect To Database Using Custom Params", "Delete All Rows From Table", "Description", "Disconnect From Database", "Execute Sql Script", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X", "Set Auto Commit", "Table Must Exist"], "accepts": ["string"]}, {"type": "Standard", "name": "string", "doc": "<p>All arguments are converted to Unicode strings.</p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Connect To Database", "Connect To Database Using Custom Connection String", "Connect To Database Using Custom Params", "Delete All Rows From Table", "Description", "Disconnect From Database", "Execute Sql Script", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X", "Set Auto Commit", "Switch Database", "Table Must Exist"], "accepts": ["Any"]}]}
+libdoc = {"specversion": 3, "name": "DatabaseLibrary", "doc": "<p>The Database Library for <a href=\"https://robotframework.org\">Robot Framework</a> allows you to query a database and verify the results. It requires an appropriate <b>Python module to be installed separately</b> - depending on your database, like e.g. <span class=\"name\">oracledb</span> or <span class=\"name\">pymysql</span>.</p>\n<h3 id=\"Table of contents\">Table of contents</h3>\n<ul>\n<li><a href=\"#Requirements\" class=\"name\">Requirements</a></li>\n<li><a href=\"#Installation\" class=\"name\">Installation</a></li>\n<li><a href=\"#Basic%20usage%20examples\" class=\"name\">Basic usage examples</a></li>\n<li><a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a></li>\n<li><a href=\"#Using%20configuration%20file\" class=\"name\">Using configuration file</a></li>\n<li><a href=\"#Inline%20assertions\" class=\"name\">Inline assertions</a></li>\n<li><a href=\"#Retry%20mechanism\" class=\"name\">Retry mechanism</a></li>\n<li><a href=\"#Logging%20query%20results\" class=\"name\">Logging query results</a></li>\n<li><a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a></li>\n<li><a href=\"#Database%20modules%20compatibility\" class=\"name\">Database modules compatibility</a></li>\n<li><a href=\"#Importing\" class=\"name\">Importing</a></li>\n<li><a href=\"#Keywords\" class=\"name\">Keywords</a></li>\n</ul>\n<h2 id=\"Requirements\">Requirements</h2>\n<ul>\n<li>Python</li>\n<li>Robot Framework</li>\n<li>Python database module you're going to use - e.g. <span class=\"name\">oracledb</span></li>\n</ul>\n<h2 id=\"Installation\">Installation</h2>\n<pre>\npip install robotframework-databaselibrary\n</pre>\n<p>Don't forget to install the required Python database module!</p>\n<h2 id=\"Basic usage examples\">Basic usage examples</h2>\n<pre>\n<b>*</b> Settings <b>*</b>\nLibrary       DatabaseLibrary\nTest Setup    Connect To My Oracle DB\n\n<b>*</b> Keywords <b>*</b>\nConnect To My Oracle DB\n    Connect To Database\n    ...    oracledb\n    ...    db_name=db\n    ...    db_user=my_user\n    ...    db_password=my_pass\n    ...    db_host=127.0.0.1\n    ...    db_port=1521\n\n<b>*</b> Test Cases <b>*</b>\nGet All Names\n    ${Rows}=    Query    select FIRST_NAME, LAST_NAME from person\n    Should Be Equal    ${Rows}[0][0]    Franz Allan\n    Should Be Equal    ${Rows}[0][1]    See\n    Should Be Equal    ${Rows}[1][0]    Jerry\n    Should Be Equal    ${Rows}[1][1]    Schneider\n\nPerson Table Contains Expected Records\n    ${sql}=    Catenate    select LAST_NAME from person\n    Check Query Result    ${sql}    contains    See\n    Check Query Result    ${sql}    equals      Schneider    row=1\n\nWait Until Table Gets New Record\n    ${sql}=    Catenate    select LAST_NAME from person\n    Check Row Count    ${sql}    &gt;    2    retry_timeout=5s\n\nPerson Table Contains No Joe\n    ${sql}=    Catenate    SELECT id FROM person\n    ...                    WHERE FIRST_NAME= 'Joe'\n    Check Row Count    ${sql}   ==    0\n\n</pre>\n<h2 id=\"Handling multiple database connections\">Handling multiple database connections</h2>\n<p>The library can handle multiple connections to different databases using <b>aliases</b>. An alias is set while creating a connection and can be passed to library keywords in a corresponding argument.</p>\n<h3 id=\"Example\">Example</h3>\n<pre>\n<b>*</b> Settings <b>*</b>\nLibrary          DatabaseLibrary\nTest Setup       Connect To All Databases\nTest Teardown    Disconnect From All Databases\n\n<b>*</b> Keywords <b>*</b>\nConnect To All Databases\n    Connect To Database\n    ...    psycopg2\n    ...    db_name=db\n    ...    db_user=db_user\n    ...    db_password=pass\n    ...    db_host=127.0.0.1\n    ...    db_port=5432\n    ...    alias=postgres\n    Connect To Database\n    ...    pymysql\n    ...    db_name=db\n    ...    db_user=db_user\n    ...    db_password=pass\n    ...    db_host=127.0.0.1\n    ...    db_port=3306\n    ...    alias=mysql\n\n<b>*</b> Test Cases <b>*</b>\nUsing Aliases\n    ${names}=    Query    select LAST_NAME from person    alias=postgres\n    Execute Sql String    drop table XYZ                  alias=mysql\n\nSwitching Default Alias\n    Switch Database    postgres\n    ${names}=    Query    select LAST_NAME from person\n    Switch Database    mysql\n    Execute Sql String    drop table XYZ\n\n</pre>\n<h2 id=\"Using configuration file\">Using configuration file</h2>\n<p>The <a href=\"#Connect%20To%20Database\" class=\"name\">Connect To Database</a> keyword allows providing the connection parameters in two ways:</p>\n<ul>\n<li>As keyword arguments</li>\n<li>In a configuration file - a simple list of <i>key=value</i> pairs, set inside an <i>alias</i> section.</li>\n</ul>\n<p>You can use only one way or you can combine them:</p>\n<ul>\n<li>The keyword arguments are taken by default</li>\n<li>If no keyword argument is provided, a parameter value is searched in the config file</li>\n</ul>\n<p>Along with commonly used connection parameters, named exactly as keyword arguments, a config file can contain any other DB module specific parameters as key/value pairs. If same custom parameter is provided both as a keyword argument <b>and</b> in config file, the <b>keyword argument value takes precedence</b>.</p>\n<p>The path to the config file is set by default to <span class=\"name\">./resources/db.cfg</span>. You can change it using an according parameter in the <a href=\"#Connect%20To%20Database\" class=\"name\">Connect To Database</a> keyword.</p>\n<p>A config file <b>must</b> contain at least one section name - the connection alias, if used (see <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>), or <span class=\"name\">[default]</span> if no aliases are used.</p>\n<h3 id=\"Config file examples\">Config file examples</h3>\n<h4 id=\"Config file with default alias (equal to using no aliases at all)\">Config file with default alias (equal to using no aliases at all)</h4>\n<pre>\n[default]\ndb_module=psycopg2\ndb_name=yourdbname\ndb_user=yourusername\ndb_password=yourpassword\ndb_host=yourhost\ndb_port=yourport\n</pre>\n<h4 id=\"Config file with a specific alias\">Config file with a specific alias</h4>\n<pre>\n[myoracle]\ndb_module=oracledb\ndb_name=yourdbname\ndb_user=yourusername\ndb_password=yourpassword\ndb_host=yourhost\ndb_port=yourport\n</pre>\n<h4 id=\"Config file with some params only\">Config file with some params only</h4>\n<pre>\n[default]\ndb_password=mysecret\n</pre>\n<h4 id=\"Config file with some custom DB module specific params\">Config file with some custom DB module specific params</h4>\n<pre>\n[default]\nmy_custom_param=value\n</pre>\n<h2 id=\"Inline assertions\">Inline assertions</h2>\n<p>Keywords, that accept arguments <code>assertion_operator</code> &lt;<a href=\"#type-AssertionOperator\" class=\"name\">AssertionOperator</a>&gt; and <code>expected_value</code>, perform a check according to the specified condition - using the <a href=\"https://github.com/MarketSquare/AssertionEngine\">Assertion Engine</a>.</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person</td>\n<td><b>==</b></td>\n<td>2</td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>contains</b></td>\n<td>Allan</td>\n</tr>\n</table>\n<h2 id=\"Retry mechanism\">Retry mechanism</h2>\n<p>Assertion keywords, that accept arguments <code>retry_timeout</code> and <code>retry_pause</code>, support waiting for assertion to pass.</p>\n<p>Setting the <code>retry_timeout</code> argument enables the mechanism - in this case the SQL request and the assertion are executed in a loop, until the assertion is passed or the <code>retry_timeout</code> is reached. The pause between the loop iterations is set using the <code>retry_pause</code> argument.</p>\n<p>The argument values are set in <a href=\"http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#time-format\">Robot Framework time format</a> - e.g. <code>5 seconds</code>.</p>\n<p>The retry mechanism is disabled by default - <code>retry_timeout</code> is set to <code>0</code>.</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person</td>\n<td><b>==</b></td>\n<td>2</td>\n<td>retry_timeout=10 seconds</td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>contains</b></td>\n<td>Allan</td>\n<td>retry_timeout=5s</td>\n<td>retry_pause=1s</td>\n</tr>\n</table>\n<h2 id=\"Logging query results\">Logging query results</h2>\n<p>Keywords, that fetch results of a SQL query, print the result rows as a table in RF log.</p>\n<ul>\n<li>A log head limit of <b>50 rows</b> is applied, other table rows are truncated in the log message.</li>\n<li>The limit and the logging in general can be adjusted any time in your tests using the Keyword <a href=\"#Set%20Logging%20Query%20Results\" class=\"name\">Set Logging Query Results</a>.</li>\n</ul>\n<p>You can also setup the limit or disable the logging during the library import. Examples:</p>\n<pre>\n<b>*</b> Settings <b>*</b>\n# Default behavior - logging of query results is enabled, log head is 50 rows.\nLibrary    DatabaseLibrary\n\n# Logging of query results is disabled, log head is 50 rows (default).\nLibrary    DatabaseLibrary    log_query_results=False\n\n# Logging of query results is enabled (default), log head is 10 rows.\nLibrary    DatabaseLibrary    log_query_results_head=10\n\n# Logging of query results is enabled (default), log head limit is disabled (log all rows).\nLibrary    DatabaseLibrary    log_query_results_head=0\n</pre>\n<h2 id=\"Commit behavior\">Commit behavior</h2>\n<p>While creating a database connection, the library doesn't explicitly set the <i>autocommit</i> behavior - so the default value of the Python DB module is used. According to Python DB API specification it should be disabled by default - which means each SQL transaction must contain a dedicated commit statement, if necessary.</p>\n<p>The library manages it for you:</p>\n<ul>\n<li>Keywords like <a href=\"#Execute%20Sql%20String\" class=\"name\">Execute SQL String</a> perform automatically a commit after running the query - or a rollback in case of error</li>\n<li>Keywords like <a href=\"#Query\" class=\"name\">Query</a> don't perform a commit, but also do a rollback in case of error</li>\n</ul>\n<p>You can turn off this automatic commit/rollback behavior using the <code>no_transaction</code> parameter. See docs of a particular keyword.</p>\n<p>It's also possible to explicitly set the <i>autocommit</i> behavior on the Python DB module level - using the <a href=\"#Set%20Auto%20Commit\" class=\"name\">Set Auto Commit</a> keyword. This has no impact on the automatic commit/rollback behavior in library keywords (described above).</p>\n<h2 id=\"Database modules compatibility\">Database modules compatibility</h2>\n<p>The library is basically compatible with any <a href=\"https://peps.python.org/pep-0249\">Python Database API Specification 2.0</a> module.</p>\n<p>However, the actual implementation in existing Python modules is sometimes quite different, which requires custom handling in the library. Therefore, there are some modules, which are \"natively\" supported in the library - and others, which may work and may not.</p>\n<h3 id=\"Python modules currently \"natively\" supported\">Python modules currently \"natively\" supported</h3>\n<h4 id=\"Oracle\">Oracle</h4>\n<p><a href=\"https://oracle.github.io/python-oracledb/\">oracledb</a></p>\n<ul>\n<li>Both thick and thin client modes are supported - you can select one using the <span class=\"name\">oracle_driver_mode</span> parameter.</li>\n<li>However, due to current limitations of the oracledb module, <b>*it's not possible to switch between thick and thin modes during a test execution session*</b> - even in different suites.</li>\n</ul>\n<p><a href=\"https://oracle.github.io/python-cx_Oracle/\">cx_Oracle</a></p>\n<h4 id=\"MySQL\">MySQL</h4>\n<ul>\n<li><a href=\"https://github.com/PyMySQL/PyMySQL\">pymysql</a></li>\n<li><a href=\"https://mysqlclient.readthedocs.io/index.html\">MySQLdb</a></li>\n</ul>\n<h4 id=\"PostgreSQL\">PostgreSQL</h4>\n<ul>\n<li><a href=\"https://www.psycopg.org/docs/\">psycopg2</a></li>\n</ul>\n<h4 id=\"MS SQL Server\">MS SQL Server</h4>\n<ul>\n<li><a href=\"https://github.com/pymssql/pymssql\">pymssql</a></li>\n</ul>\n<h4 id=\"SQLite\">SQLite</h4>\n<ul>\n<li><a href=\"https://docs.python.org/3/library/sqlite3.html\">sqlite3</a></li>\n</ul>\n<h4 id=\"Teradata\">Teradata</h4>\n<ul>\n<li><a href=\"https://github.com/teradata/PyTd\">teradata</a></li>\n</ul>\n<h4 id=\"IBM DB2\">IBM DB2</h4>\n<ul>\n<li><a href=\"https://github.com/ibmdb/python-ibmdb\">ibm_db</a></li>\n<li><a href=\"https://github.com/ibmdb/python-ibmdb\">ibm_db_dbi</a></li>\n</ul>\n<h4 id=\"ODBC\">ODBC</h4>\n<ul>\n<li><a href=\"https://github.com/mkleehammer/pyodbc\">pyodbc</a></li>\n<li><a href=\"https://github.com/pypyodbc/pypyodbc\">pypyodbc</a></li>\n</ul>\n<h4 id=\"Kingbase\">Kingbase</h4>\n<ul>\n<li>ksycopg2</li>\n</ul>", "version": "", "generated": "2024-09-30T19:15:24+00:00", "type": "LIBRARY", "scope": "GLOBAL", "docFormat": "HTML", "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/__init__.py", "lineno": 25, "tags": [], "inits": [{"name": "__init__", "args": [{"name": "log_query_results", "type": null, "defaultValue": "True", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "log_query_results=True"}, {"name": "log_query_results_head", "type": null, "defaultValue": "50", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "log_query_results_head=50"}], "returnType": null, "doc": "<p>The library can be imported without any arguments:</p>\n<pre>\n<b>*</b> Settings <b>*</b>\nLibrary    DatabaseLibrary\n</pre>\n<p>Use optional library import parameters to disable <a href=\"#Logging%20query%20results\" class=\"name\">Logging query results</a> or setup the log head.</p>", "shortdoc": "The library can be imported without any arguments: | *** Settings *** | Library    DatabaseLibrary Use optional library import parameters to disable `Logging query results` or setup the log head.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/__init__.py", "lineno": 269}], "keywords": [{"name": "Call Stored Procedure", "args": [{"name": "procedure_name", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "procedure_name: str"}, {"name": "procedure_params", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "procedure_params: List | None = None"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "additional_output_params", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "additional_output_params: List | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "spName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "spName: str | None = None"}, {"name": "spParams", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "List", "typedoc": "list", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "spParams: List | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Calls a stored procedure <span class=\"name\">procedure_name</span> with the <span class=\"name\">procedure_params</span> - a <b>list</b> of parameters the procedure requires. <b>Returns two lists</b> - the <i>parameter values</i> and the <i>result sets</i>.</p>\n<p>Use the special <b>CURSOR</b> value for OUT params, which should receive result sets - relevant only for some databases (e.g. Oracle or PostgreSQL).</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction commit or rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use the <code>additional_output_params</code> list for OUT params of a procedure in MSSQL.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>spName</code>, <code>spParams</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>procedure_name</code>, <code>procedure_params</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h2>Handling parameters and result sets</h2>\n<p>Handling the input and output parameters and the result sets is very different depending on the database itself and on the Python database driver - i.e. how it implements the <span class=\"name\">cursor.callproc()</span> function.</p>\n<h3>Common case (e.g. MySQL)</h3>\n<p>Generally a procedure call requires all parameter values (IN and OUT) put together in a list - <span class=\"name\">procedure_params</span>.</p>\n<p>Calling the procedure returns <b>two lists</b>:</p>\n<ul>\n<li><b>Param values</b> - the copy of procedure parameters (modified, if the procedure changes the OUT params). The list is empty, if procedures receives no params.</li>\n<li><b>Result sets</b> - the list of lists, each of them containing results of some query, if the procedure returns them.</li>\n</ul>\n<h3>Oracle (oracledb, cx_Oracle)</h3>\n<p>Oracle procedures work fine with simple IN and OUT params, but require some special handling of result sets.</p>\n<h4>Simple case with IN and OUT params (no result sets)</h4>\n<p>Consider the following procedure:</p>\n<pre>\nCREATE OR REPLACE PROCEDURE\nget_second_name (person_first_name IN VARCHAR, person_second_name OUT VARCHAR) AS\nBEGIN\n  SELECT last_name\n  INTO person_second_name\n  FROM person\n  WHERE first_name = person_first_name;\nEND;\n</pre>\n<p>Calling the procedure in Robot Framework:</p>\n<pre>\n@{params}=         Create List    Jerry    OUTPUT\n# Second parameter value can be anything, it will be replaced anyway\n\n${param values}    ${result sets}=    Call Stored Procedure    get_second_name    ${params}\n# ${param values} = ['Jerry', 'Schneider']\n# ${result sets} = []\n</pre>\n<h4>Oracle procedure returning a result set</h4>\n<p>If a procedure in Oracle should return a result set, it must take OUT parameters of a special type - <i>SYS_REFCURSOR</i>.</p>\n<p>Consider the following procedure:</p>\n<pre>\nget_all_second_names (second_names_cursor OUT SYS_REFCURSOR) AS\nBEGIN\n  OPEN second_names_cursor for\n  SELECT LAST_NAME FROM person;\nEND;\n</pre>\n<p>Calling the procedure in Robot Framework requires the special value <b>CURSOR</b> for the OUT parameters, they will be converted to appropriate DB variables before calling the procedure.</p>\n<pre>\n@{params}=    Create List    CURSOR\n# The parameter must have this special value CURSOR\n\n${param values}    ${result sets}=    Call Stored Procedure    get_all_second_names    ${params}\n# ${param values} = [&lt;oracledb.Cursor on &lt;oracledb.Connection ...&gt;&gt;]\n# ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]\n</pre>\n<h4>Oracle procedure returning multiple result sets</h4>\n<p>If a procedure takes multiple OUT parameters of the <i>SYS_REFCURSOR</i> type, they all must have the special <b>CURSOR</b> value when calling the procedure:</p>\n<pre>\n@{params} =        Create List         CURSOR    CURSOR\n${param values}    ${result sets} =    Call Stored Procedure    Get_all_first_and_second_names    ${params}\n# ${param values} = [&lt;oracledb.Cursor on &lt;oracledb.Connection ...&gt;&gt;, &lt;oracledb.Cursor on &lt;oracledb.Connection ...&gt;&gt;]\n# ${result sets}  = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]\n</pre>\n<h3>PostgreSQL (psycopg2, psycopg3)</h3>\n<p>PostgreSQL doesn't return single values as params, only as result sets. It also supports special handling of result sets over OUT params of a special type (like Oracle).</p>\n<h4>Simple case with IN and OUT params (no CURSOR parameters)</h4>\n<p>Consider the following procedure:</p>\n<pre>\nCREATE FUNCTION\nget_second_name (IN person_first_name VARCHAR(20),\nOUT person_second_name VARCHAR(20))\nLANGUAGE plpgsql\nAS\n'\nBEGIN\n  SELECT LAST_NAME INTO person_second_name\n  FROM person\n  WHERE FIRST_NAME = person_first_name;\nEND\n';\n</pre>\n<p>Calling the procedure in Robot Framework:</p>\n<pre>\n@{params}=    Create List    Jerry\n${param values}    ${result sets}=    Call Stored Procedure    get_second_name    ${params}\n# ${param values} = ['Jerry']\n# ${result sets} = [[('Schneider',)]]\n</pre>\n<h4>PostgreSQL procedure with CURSOR parameters</h4>\n<p>If a procedure in PostgreSQL should return a proper result set, it must take OUT parameters of a special type - <i>refcursor</i>.</p>\n<p>Consider the following procedure:</p>\n<pre>\nCREATE FUNCTION\nget_all_first_and_second_names(result1 refcursor, result2 refcursor)\nRETURNS SETOF refcursor\nLANGUAGE plpgsql\nAS\n'\nBEGIN\n  OPEN result1 FOR SELECT FIRST_NAME FROM person;\n  RETURN NEXT result1;\n  OPEN result2 FOR SELECT LAST_NAME FROM person;\n  RETURN NEXT result2;\nEND\n';\n</pre>\n<p>Calling the procedure in Robot Framework requires the special value <b>CURSOR</b> for the OUT parameters, they will be converted to appropriate DB variables before calling the procedure.</p>\n<pre>\n@{params}=    Create List    CURSOR    CURSOR\n# The parameters must have this special value CURSOR\n\n${param values}    ${result sets}=    Call Stored Procedure    get_all_first_and_second_names    ${params}\n# ${param values} = ['CURSOR_0', 'CURSOR_1']\n# ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]\n</pre>\n<h3>MS SQL Server (pymssql)</h3>\n<p>The <i>pymssql</i> driver doesn't natively support getting the OUT parameter values after calling a procedure.</p>\n<ul>\n<li>This requires special handling of OUT parameters using the <span class=\"name\">additional_output_params</span> argument.</li>\n<li>Furthermore, it's not possible to fetch the OUT parameter values for a procedure, which returns a result set AND has OUT parameters.</li>\n</ul>\n<h4>Simple case with IN and OUT params (no result sets)</h4>\n<p>Consider the following procedure:</p>\n<pre>\nCREATE PROCEDURE\nreturn_out_param_without_result_sets\n@my_input VARCHAR(20),\n@my_output INT OUTPUT\nAS\nBEGIN\n IF @my_input = 'give me 1'\n    BEGIN\n        SELECT @my_output = 1;\n    END\n    ELSE\n    BEGIN\n        SELECT @my_output = 0;\n    END\nEND;\n</pre>\n<p>Calling the procedure in Robot Framework requires putting the IN parameters as usual in the <span class=\"name\">procedure_params</span> argument, but the sample values of OUT parameters must be put in the argument <span class=\"name\">additional_output_params</span>.</p>\n<pre>\n@{params}=    Create List    give me 1\n@{out_params}=    Create List    ${9}\n${param values}    ${result sets}=    Call Stored Procedure    return_out_param_without_result_sets\n...    ${params}    additional_output_params=${out_params}\n# ${result sets} = []\n# ${param values} = ('give me 1', 1)\n</pre>\n<p>The library uses the sample values in the <span class=\"name\">additional_output_params</span> list to determine the number and the type of OUT parameters - so they are type-sensitive, the type must be the same as in the procedure itself.</p>\n<h4>MS SQL procedure returning a result set (no OUT params)</h4>\n<p>If a procedure doesn't have any OUT params and returns only result sets, they are handled in a normal way. Consider the following procedure:</p>\n<pre>\nCREATE PROCEDURE get_all_first_and_second_names\nAS\nBEGIN\n  SELECT FIRST_NAME FROM person;\n  SELECT LAST_NAME FROM person;\n  RETURN;\nEND;\n</pre>\n<p>Calling the procedure in Robot Framework:</p>\n<pre>\n${param values}    ${result sets}=    Call Stored Procedure    get_all_first_and_second_names\n${param values} = ()\n${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]\n</pre>\n<h4>MS SQL procedure returning result sets AND OUT params</h4>\n<p>This case is <b>not fully supported</b> by the library - the OUT params won't be fetched.</p>", "shortdoc": "Calls a stored procedure `procedure_name` with the `procedure_params` - a *list* of parameters the procedure requires. *Returns two lists* - the _parameter values_ and the _result sets_.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 420}, {"name": "Check If Exists In Database", "args": [{"name": "select_statement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "select_statement: str"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "NAMED_ONLY", "required": false, "repr": "no_transaction: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "parameters: Tuple | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Check%20Row%20Count\" class=\"name\">Check Row Count</a> keyword with assertion engine instead. The deprecated keyword will be removed in future versions.</p>\n<p>Check if any row would be returned by given the input <code>select_statement</code>. If there are no results, then this will throw an AssertionError.</p>\n<p>Set optional input <code>no_transaction</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td></td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n</tr>\n<tr>\n<td>Check If Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 29, "deprecated": true}, {"name": "Check If Not Exists In Database", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Check%20Row%20Count\" class=\"name\">Check Row Count</a> keyword with assertion engine instead. The deprecated keyword will be removed in future versions.</p>\n<p>This is the negation of <span class=\"name\">check_if_exists_in_database</span>.</p>\n<p>Check if no rows would be returned by given the input <code>selectStatement</code>. If there are any results, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td></td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n</tr>\n<tr>\n<td>Check If Not Exists In Database</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 69, "deprecated": true}, {"name": "Check Query Result", "args": [{"name": "select_statement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "select_statement: str"}, {"name": "assertion_operator", "type": {"name": "AssertionOperator", "typedoc": "AssertionOperator", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "assertion_operator: AssertionOperator"}, {"name": "expected_value", "type": {"name": "Any", "typedoc": "Any", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "expected_value: Any"}, {"name": "row", "type": null, "defaultValue": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "row=0"}, {"name": "col", "type": null, "defaultValue": "0", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "col=0"}, {"name": "assertion_message", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "assertion_message: str | None = None"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}, {"name": "retry_timeout", "type": null, "defaultValue": "0 seconds", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_timeout=0 seconds"}, {"name": "retry_pause", "type": null, "defaultValue": "0.5 seconds", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_pause=0.5 seconds"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "selectStatement", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "selectStatement: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Check value in query result returned from <code>select_statement</code> using <code>assertion_operator</code> and <code>expected_value</code>. The value position in results can be adjusted using <code>row</code> and <code>col</code> parameters (0-based). See <a href=\"#Inline%20assertions\" class=\"name\">Inline assertions</a> for more details.</p>\n<p><b>The assertion in this keyword is type sensitive!</b> The <code>expected_value</code> is taken as a string, no argument conversion is performed. Use RF syntax like <code>${1}</code> for numeric values.</p>\n<p>Use optional <code>assertion_message</code> to override the default error message.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Use <code>retry_timeout</code> and <code>retry_pause</code> parameters to enable waiting for assertion to pass. See <a href=\"#Retry%20mechanism\" class=\"name\">Retry mechanism</a> for more details.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>selectStatement</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>select_statement</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>contains</b></td>\n<td>Allan</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name, last_name FROM person</td>\n<td><b>==</b></td>\n<td>Schneider</td>\n<td>row=1</td>\n<td>col=1</td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td><b>==</b></td>\n<td>2</td>\n<td># Fails, if query returns an integer value</td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td><b>==</b></td>\n<td>${2}</td>\n<td># Works, if query returns an integer value</td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>equal</b></td>\n<td>Franz Allan</td>\n<td>assertion_message=my error message</td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>inequal</b></td>\n<td>John</td>\n<td>alias=my_alias</td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>contains</b></td>\n<td>Allan</td>\n<td>no_transaction=True</td>\n<td></td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Check Query Result</td>\n<td>SELECT first_name FROM person</td>\n<td><b>contains</b></td>\n<td>Allan</td>\n<td>parameters=${parameters}</td>\n<td></td>\n</tr>\n</table>", "shortdoc": "Check value in query result returned from ``select_statement`` using ``assertion_operator`` and ``expected_value``. The value position in results can be adjusted using ``row`` and ``col`` parameters (0-based). See `Inline assertions` for more details.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 332}, {"name": "Check Row Count", "args": [{"name": "select_statement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "select_statement: str"}, {"name": "assertion_operator", "type": {"name": "AssertionOperator", "typedoc": "AssertionOperator", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "assertion_operator: AssertionOperator"}, {"name": "expected_value", "type": {"name": "int", "typedoc": "integer", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "expected_value: int"}, {"name": "assertion_message", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "assertion_message: str | None = None"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}, {"name": "retry_timeout", "type": null, "defaultValue": "0 seconds", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_timeout=0 seconds"}, {"name": "retry_pause", "type": null, "defaultValue": "0.5 seconds", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "retry_pause=0.5 seconds"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "selectStatement", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "selectStatement: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Check the number of rows returned from <code>select_statement</code> using <code>assertion_operator</code> and <code>expected_value</code>. See <a href=\"#Inline%20assertions\" class=\"name\">Inline assertions</a> for more details.</p>\n<p>Use <code>assertion_message</code> to override the default error message.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Use <code>retry_timeout</code> and <code>retry_pause</code> parameters to enable waiting for assertion to pass. See <a href=\"#Retry%20mechanism\" class=\"name\">Retry mechanism</a> for more details.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>selectStatement</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>select_statement</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td><b>==</b></td>\n<td>1</td>\n<td></td>\n</tr>\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td><b>&gt;=</b></td>\n<td>2</td>\n<td>assertion_message=my error message</td>\n</tr>\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td><b>inequal</b></td>\n<td>3</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td><b>less than</b></td>\n<td>4</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>Check Row Count</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td><b>equals</b></td>\n<td>5</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Check the number of rows returned from ``select_statement`` using ``assertion_operator`` and ``expected_value``. See `Inline assertions` for more details.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 269}, {"name": "Connect To Database", "args": [{"name": "db_module", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_module: str | None = None"}, {"name": "db_name", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_name: str | None = None"}, {"name": "db_user", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_user: str | None = None"}, {"name": "db_password", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_password: str | None = None"}, {"name": "db_host", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_host: str | None = None"}, {"name": "db_port", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "int", "typedoc": "integer", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_port: int | None = None"}, {"name": "db_charset", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_charset: str | None = None"}, {"name": "odbc_driver", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "odbc_driver: str | None = None"}, {"name": "config_file", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "config_file: str | None = None"}, {"name": "oracle_driver_mode", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "oracle_driver_mode: str | None = None"}, {"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": "default", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str = default"}, {"name": "custom_connection_params", "type": null, "defaultValue": null, "kind": "VAR_NAMED", "required": false, "repr": "**custom_connection_params"}], "returnType": null, "doc": "<p>Creates a database connection using the DB API 2.0 <code>db_module</code> and the parameters provided. Along with listed commonly used arguments (<span class=\"name\">db_name</span>, <span class=\"name\">db_host</span> etc.) you can set any other DB module specific parameters as key/value pairs.</p>\n<p>Use <code>config_file</code> to provide a path to configuration file with connection parameters to be used along with / instead of keyword arguments. If no specified, it defaults to <span class=\"name\">./resources/db.cfg</span>. See <a href=\"#Using%20configuration%20file\" class=\"name\">Using configuration file</a> for more details.</p>\n<p>All params are optional, although <code>db_module</code> must be set - either as keyword argument or in config file. If some of the listed keyword arguments (<span class=\"name\">db_name</span>, <span class=\"name\">db_host</span> etc.) are not provided (i.e. left on default value <a href=\"#type-None\" class=\"name\">None</a>), they are normally not passed to the Python DB module at all, except:</p>\n<ul>\n<li><i>db_port</i> - commonly used port number for known databases is set as fallback</li>\n<li><i>db_charset</i> - <i>UTF8</i> is used as fallback for <i>pymysql</i>, <i>pymssql</i> and <i>pyodbc</i></li>\n<li><i>oracle_driver_mode</i> - <i>thin</i> is used as fallback for <i>oracledb</i></li>\n</ul>\n<p>Other custom params from keyword arguments and config file are passed to the Python DB module as provided - normally as arguments for the <i>connect()</i> function. However, when using <b>pyodbc</b> or <b>ibm_db</b>, the connection is established using a <b>connection string</b> - so all the custom params are added into it instead of function arguments.</p>\n<p>Set <code>alias</code> for <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>. If the same alias is given twice, then previous connection will be overridden.</p>\n<p>The <code>oracle_driver_mode</code> is used to select the <b>oracledb</b> client mode. Allowed values are:</p>\n<ul>\n<li><i>thin</i> (default if omitted)</li>\n<li><i>thick</i></li>\n<li><i>thick,lib_dir=&lt;PATH_TO_ORACLE_CLIENT&gt;</i></li>\n</ul>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>dbapiModuleName</code>, <code>dbName</code>, <code>dbUsername</code>, <code>dbPassword</code>, <code>dbHost</code>, <code>dbPort</code>, <code>dbCharset</code>, <code>dbDriver</code>, <code>dbConfigFile</code> and <code>driverMode</code> are <b>deprecated</b>, please use new parameters <code>db_module</code>, <code>db_name</code>, <code>db_user</code>, <code>db_password</code>, <code>db_host</code>, <code>db_port</code>, <code>db_charset</code>, <code>odbc_driver</code>, <code>config_file</code> and <code>oracle_driver_mode</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db</td>\n<td>user</td>\n<td>pass</td>\n<td>tiger.foobar.com</td>\n<td>5432</td>\n<td></td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db</td>\n<td>user</td>\n<td>pass</td>\n<td>tiger.foobar.com</td>\n<td>5432</td>\n<td>my_custom_param=value</td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>psycopg2</td>\n<td>my_db</td>\n<td>user</td>\n<td>pass</td>\n<td>tiger.foobar.com</td>\n<td>5432</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Connect To Database</td>\n<td>config_file=my_db_params.cfg</td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n</table>", "shortdoc": "Creates a database connection using the DB API 2.0 ``db_module`` and the parameters provided. Along with listed commonly used arguments (`db_name`, `db_host` etc.) you can set any other DB module specific parameters as key/value pairs.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 175}, {"name": "Connect To Database Using Custom Connection String", "args": [{"name": "db_module", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_module: str | None = None"}, {"name": "db_connect_string", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": "", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_connect_string: str = "}, {"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": "default", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str = default"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "dbapiModuleName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "dbapiModuleName: str | None = None"}], "returnType": null, "doc": "<p>Loads the DB API 2.0 module given <code>db_module</code> then uses it to connect to the database using the <code>db_connect_string</code> (parsed as single connection string or URI).</p>\n<p>Use <a href=\"#Connect%20To%20Database\" class=\"name\">Connect To Database</a> for passing custom connection params as named arguments.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameter <code>dbapiModuleName</code> is <b>deprecated</b>, please use new parameter <code>db_module</code> instead.</p>\n<p><b>The old parameter will be removed in future versions.</b></p>\n<p>Example usage:</p>\n<table border=\"1\">\n<tr>\n<td>Connect To Database Using Custom Connection String</td>\n<td>psycopg2</td>\n<td><a href=\"postgresql://postgres:s3cr3t@tiger.foobar.com:5432/my_db_test\">postgresql://postgres:s3cr3t@tiger.foobar.com:5432/my_db_test</a></td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Connection String</td>\n<td>oracledb</td>\n<td>username/pass@localhost:1521/orclpdb</td>\n</tr>\n</table>", "shortdoc": "Loads the DB API 2.0 module given ``db_module`` then uses it to connect to the database using the ``db_connect_string`` (parsed as single connection string or URI).", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 528}, {"name": "Connect To Database Using Custom Params", "args": [{"name": "db_module", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_module: str | None = None"}, {"name": "db_connect_string", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": "", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "db_connect_string: str = "}, {"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": "default", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str = default"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "dbapiModuleName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "dbapiModuleName: str | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Connect%20To%20Database\" class=\"name\">Connect To Database</a> keyword with custom parameters instead. The deprecated keyword will be removed in future versions.</p>\n<p>Loads the DB API 2.0 module given <code>db_module</code> then uses it to connect to the database using the map string <code>db_connect_string</code> (parsed as a list of named arguments).</p>\n<p>Use <span class=\"name\">connect_to_database_using_custom_connection_string</span> for passing all params in a single connection string or URI.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameter <code>dbapiModuleName</code> is <b>deprecated</b>, please use new parameter <code>db_module</code> instead.</p>\n<p><b>The old parameter will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>psycopg2</td>\n<td>database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432</td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>jaydebeapi</td>\n<td>'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t'</td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>oracledb</td>\n<td>user=\"username\", password=\"pass\", dsn=\"localhost/orclpdb\"</td>\n</tr>\n<tr>\n<td>Connect To Database Using Custom Params</td>\n<td>sqlite3</td>\n<td>database=\"./my_database.db\", isolation_level=None</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Connect To Database` keyword with custom parameters instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 485, "deprecated": true}, {"name": "Delete All Rows From Table", "args": [{"name": "table_name", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "table_name: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "tableName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "tableName: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Deletes all rows from table with <code>table_name</code>.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction commit or rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>tableName</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>table_name</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Delete All Rows From Table</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>Delete All Rows From Table</td>\n<td>person</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>Delete All Rows From Table</td>\n<td>person</td>\n<td>alias=my_alias</td>\n</tr>\n</table>", "shortdoc": "Deletes all rows from table with ``table_name``.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 197}, {"name": "Description", "args": [{"name": "select_statement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "select_statement: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "selectStatement", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "selectStatement: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Runs a query with the <code>select_statement</code> to determine the table description.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>selectStatement</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>select_statement</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>${Person table description}=</td>\n<td>Description</td>\n<td>select LAST_NAME from person</td>\n<td></td>\n</tr>\n<tr>\n<td>${Person table description}=</td>\n<td>Description</td>\n<td>select LAST_NAME from person</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>${Person table description}=</td>\n<td>Description</td>\n<td>select LAST_NAME from person</td>\n<td>alias=postgres</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>${Person table description}=</td>\n<td>Description</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Runs a query with the ``select_statement`` to determine the table description.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 148}, {"name": "Disconnect From All Databases", "args": [], "returnType": null, "doc": "<p>Disconnects from all the databases - useful when testing with multiple database connections (aliases).</p>", "shortdoc": "Disconnects from all the databases - useful when testing with multiple database connections (aliases).", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 585}, {"name": "Disconnect From Database", "args": [{"name": "error_if_no_connection", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "error_if_no_connection: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}], "returnType": null, "doc": "<p>Disconnects from the database.</p>\n<p>By default, it's not an error if there was no open database connection - suitable for usage as a teardown. However, you can enforce it using the <code>error_if_no_connection</code> parameter.</p>\n<p>Use <code>alias</code> to specify what connection should be closed if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Disconnect From Database</td>\n<td></td>\n</tr>\n<tr>\n<td>Disconnect From Database</td>\n<td>alias=postgres</td>\n</tr>\n</table>", "shortdoc": "Disconnects from the database.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 562}, {"name": "Execute Sql Script", "args": [{"name": "script_path", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "script_path: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "split", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "True", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "split: bool = True"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "sqlScriptFileName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sqlScriptFileName: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Executes the content of the SQL script file loaded from <span class=\"name\">script_path</span> as SQL commands.</p>\n<p>SQL commands are expected to be delimited by a semicolon (';') - they will be split and executed separately. Set <code>split</code> to <i>False</i> to disable this behavior  - in this case the entire script content will be passed to the database module for execution as a single command.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction commit or rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>sqlScriptFileName</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>script_path</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Execute SQL Script</td>\n<td>insert_data_in_person_table.sql</td>\n<td></td>\n</tr>\n<tr>\n<td>Execute SQL Script</td>\n<td>insert_data_in_person_table.sql</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>Execute SQL Script</td>\n<td>insert_data_in_person_table.sql</td>\n<td>alias=postgres</td>\n</tr>\n<tr>\n<td>Execute SQL Script</td>\n<td>insert_data_in_person_table.sql</td>\n<td>split=False</td>\n</tr>\n</table>", "shortdoc": "Executes the content of the SQL script file loaded from `script_path` as SQL commands.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 243}, {"name": "Execute Sql String", "args": [{"name": "sql_string", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "sql_string: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}, {"name": "omit_trailing_semicolon", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "omit_trailing_semicolon: bool | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "sqlString", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sqlString: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}, {"name": "omitTrailingSemicolon", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "omitTrailingSemicolon: bool | None = None"}], "returnType": null, "doc": "<p>Executes the <code>sql_string</code> as a single SQL command.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction commit or rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Use <code>omit_trailing_semicolon</code> for explicit instruction, if the trailing semicolon (;) at the SQL string end should be removed or not:</p>\n<ul>\n<li>Some database modules (e.g. Oracle) throw an exception, if you leave a semicolon at the string end</li>\n<li>However, there are exceptional cases, when you need it even for Oracle - e.g. at the end of a PL/SQL block</li>\n<li>If not explicitly specified, it's decided based on the current database module in use. For Oracle, the semicolon is removed by default.</li>\n</ul>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>sqlString</code>, <code>sansTran</code> and <code>omitTrailingSemicolon</code> are <b>deprecated</b>, please use new parameters <code>sql_string</code>, <code>no_transaction</code> and <code>omit_trailing_semicolon</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM person_employee_table; DELETE FROM person_table</td>\n<td></td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM person_employee_table; DELETE FROM person_table</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM person_employee_table; DELETE FROM person_table</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>CREATE PROCEDURE proc AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello!'); END;</td>\n<td>omit_trailing_semicolon=False</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person_employee_table</td>\n</tr>\n<tr>\n<td>Execute Sql String</td>\n<td>DELETE FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Executes the ``sql_string`` as a single SQL command.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 364}, {"name": "Query", "args": [{"name": "select_statement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "select_statement: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "return_dict", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "return_dict: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "selectStatement", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "selectStatement: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}, {"name": "returnAsDict", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "returnAsDict: bool | None = None"}], "returnType": null, "doc": "<p>Runs a query with the <code>select_statement</code> and returns the result as list of rows. The type of row values depends on the database module - usually they are tuples or tuple-like objects.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Set <code>return_dict</code> to <i>True</i> to explicitly convert the return values into list of dictionaries.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>selectStatement</code>, <code>sansTran</code> and <code>returnAsDict</code> are <b>deprecated</b>, please use new parameters <code>select_statement</code>, <code>no_transaction</code> and <code>return_dict</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>${Results}=</td>\n<td>Query</td>\n<td>select LAST_NAME from person</td>\n<td></td>\n</tr>\n<tr>\n<td>${Results}=</td>\n<td>Query</td>\n<td>select LAST_NAME from person</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>${Results}=</td>\n<td>Query</td>\n<td>select LAST_NAME from person</td>\n<td>return_dict=True</td>\n</tr>\n<tr>\n<td>${Results}=</td>\n<td>Query</td>\n<td>select LAST_NAME from person</td>\n<td>alias=postgres</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>${Results}=</td>\n<td>Query</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Runs a query with the ``select_statement`` and returns the result as list of rows. The type of row values depends on the database module - usually they are tuples or tuple-like objects.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 38}, {"name": "Row Count", "args": [{"name": "select_statement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "select_statement: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "selectStatement", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "selectStatement: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Runs a query with the <code>select_statement</code> and returns the number of rows in the result.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>selectStatement</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>select_statement</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>${Rows}=</td>\n<td>Row Count</td>\n<td>select LAST_NAME from person</td>\n<td></td>\n</tr>\n<tr>\n<td>${Rows}=</td>\n<td>Row Count</td>\n<td>select LAST_NAME from person</td>\n<td>no_transaction=True</td>\n</tr>\n<tr>\n<td>${Rows}=</td>\n<td>Row Count</td>\n<td>select LAST_NAME from person</td>\n<td>alias=postgres</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>${Rows}=</td>\n<td>Row Count</td>\n<td>SELECT * FROM %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "Runs a query with the ``select_statement`` and returns the number of rows in the result.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 95}, {"name": "Row Count Is 0", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Check%20Row%20Count\" class=\"name\">Check Row Count</a> keyword with assertion engine instead. The deprecated keyword will be removed in future versions.</p>\n<p>Check if any rows are returned from the submitted <code>selectStatement</code>. If there are, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'Franz Allan'</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n</tr>\n<tr>\n<td>Row Count is 0</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 110, "deprecated": true}, {"name": "Row Count Is Equal To X", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "numRows", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "numRows: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Check%20Row%20Count\" class=\"name\">Check Row Count</a> keyword with assertion engine instead. The deprecated keyword will be removed in future versions.</p>\n<p>Check if the number of rows returned from <code>selectStatement</code> is equal to the value submitted. If not, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person</td>\n<td>1</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person</td>\n<td>3</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Equal To X</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>0</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 148, "deprecated": true}, {"name": "Row Count Is Greater Than X", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "numRows", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "numRows: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Check%20Row%20Count\" class=\"name\">Check Row Count</a> keyword with assertion engine instead. The deprecated keyword will be removed in future versions.</p>\n<p>Check if the number of rows returned from <code>selectStatement</code> is greater than the value submitted. If not, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>The default error message can be overridden with the <code>msg</code> argument.</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>0</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person</td>\n<td>1</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Greater Than X</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>0</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 188, "deprecated": true}, {"name": "Row Count Is Less Than X", "args": [{"name": "selectStatement", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "selectStatement: str"}, {"name": "numRows", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "numRows: str"}, {"name": "sansTran", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "sansTran: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "parameters", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "Tuple", "typedoc": "tuple", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "parameters: Tuple | None = None"}], "returnType": null, "doc": "<p><b>DEPRECATED</b> Use new <a href=\"#Check%20Row%20Count\" class=\"name\">Check Row Count</a> keyword with assertion engine instead. The deprecated keyword will be removed in future versions.</p>\n<p>Check if the number of rows returned from <code>selectStatement</code> is less than the value submitted. If not, then this will throw an AssertionError.</p>\n<p>Set optional input <code>sansTran</code> to <i>True</i> to run command without an explicit transaction commit or rollback.</p>\n<p>Using optional <code>msg</code> to override the default error message:</p>\n<p>Use optional <code>alias</code> parameter to specify what connection should be used for the query if you have more than one connection open.</p>\n<p>Use <code>parameters</code> for query variable substitution (variable substitution syntax may be different depending on the database client).</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>1</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>2</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>3</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = 'John'</td>\n<td>4</td>\n<td>sansTran=True</td>\n</tr>\n<tr>\n<td>@{parameters}</td>\n<td>Create List</td>\n<td>John</td>\n<td></td>\n</tr>\n<tr>\n<td>Row Count Is Less Than X</td>\n<td>SELECT id FROM person WHERE first_name = %s</td>\n<td>5</td>\n<td>parameters=${parameters}</td>\n</tr>\n</table>", "shortdoc": "*DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead. The deprecated keyword will be removed in future versions.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 228, "deprecated": true}, {"name": "Set Auto Commit", "args": [{"name": "auto_commit", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "True", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "auto_commit: bool = True"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "autoCommit", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "autoCommit: bool | None = None"}], "returnType": null, "doc": "<p>Explicitly sets the autocommit behavior of the database connection to <code>auto_commit</code>. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameter <code>autoCommit</code> is <b>deprecated</b>, please use new parameter <code>auto_commit</code> instead.</p>\n<p><b>The old parameter will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<pre>\nSet Auto Commit\nSet Auto Commit | False |\nSet Auto Commit | True  | alias=postgres |\n</pre>", "shortdoc": "Explicitly sets the autocommit behavior of the database connection to ``auto_commit``. See `Commit behavior` for details.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 595}, {"name": "Set Logging Query Results", "args": [{"name": "enabled", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "enabled: bool | None = None"}, {"name": "log_head", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "int", "typedoc": "integer", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "log_head: int | None = None"}], "returnType": null, "doc": "<p>Allows to enable/disable logging of query results and to adjust the log head value.</p>\n<ul>\n<li>Overrides the values, which were set during the library import.</li>\n<li>See <a href=\"#Logging%20query%20results\" class=\"name\">Logging query results</a> for details.</li>\n</ul>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Set Logging Query Results</td>\n<td>enabled=False</td>\n<td></td>\n</tr>\n<tr>\n<td>Set Logging Query Results</td>\n<td>enabled=True</td>\n<td>log_head=0</td>\n</tr>\n<tr>\n<td>Set Logging Query Results</td>\n<td>log_head=10</td>\n<td></td>\n</tr>\n</table>", "shortdoc": "Allows to enable/disable logging of query results and to adjust the log head value. - Overrides the values, which were set during the library import. - See `Logging query results` for details.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/query.py", "lineno": 728}, {"name": "Switch Database", "args": [{"name": "alias", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "alias: str"}], "returnType": null, "doc": "<p>Switch the default database connection to <code>alias</code>.</p>\n<p>Examples:</p>\n<table border=\"1\">\n<tr>\n<td>Switch Database</td>\n<td>my_alias</td>\n</tr>\n<tr>\n<td>Switch Database</td>\n<td>alias=my_alias</td>\n</tr>\n</table>", "shortdoc": "Switch the default database connection to ``alias``.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/connection_manager.py", "lineno": 618}, {"name": "Table Must Exist", "args": [{"name": "table_name", "type": {"name": "str", "typedoc": "string", "nested": [], "union": false}, "defaultValue": null, "kind": "POSITIONAL_OR_NAMED", "required": true, "repr": "table_name: str"}, {"name": "no_transaction", "type": {"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, "defaultValue": "False", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "no_transaction: bool = False"}, {"name": "msg", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "msg: str | None = None"}, {"name": "alias", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "POSITIONAL_OR_NAMED", "required": false, "repr": "alias: str | None = None"}, {"name": "", "type": null, "defaultValue": null, "kind": "NAMED_ONLY_MARKER", "required": false, "repr": "*"}, {"name": "tableName", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "str", "typedoc": "string", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "tableName: str | None = None"}, {"name": "sansTran", "type": {"name": "Union", "typedoc": null, "nested": [{"name": "bool", "typedoc": "boolean", "nested": [], "union": false}, {"name": "None", "typedoc": "None", "nested": [], "union": false}], "union": true}, "defaultValue": "None", "kind": "NAMED_ONLY", "required": false, "repr": "sansTran: bool | None = None"}], "returnType": null, "doc": "<p>Check if the table with <span class=\"name\">table_name</span> exists in the database.</p>\n<p>Use <code>msg</code> for custom error message.</p>\n<p>Set <code>no_transaction</code> to <i>True</i> to run command without explicit transaction rollback in case of error. See <a href=\"#Commit%20behavior\" class=\"name\">Commit behavior</a> for details.</p>\n<p>Use <code>alias</code> to specify what connection should be used if <a href=\"#Handling%20multiple%20database%20connections\" class=\"name\">Handling multiple database connections</a>.</p>\n<h4>Some parameters were renamed in version 2.0</h4>\n<p>The old parameters <code>tableName</code> and <code>sansTran</code> are <b>deprecated</b>, please use new parameters <code>table_name</code> and <code>no_transaction</code> instead.</p>\n<p><b>The old parameters will be removed in future versions.</b></p>\n<h4>Examples</h4>\n<table border=\"1\">\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td></td>\n</tr>\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td>msg=my error message</td>\n</tr>\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td>alias=my_alias</td>\n</tr>\n<tr>\n<td>Table Must Exist</td>\n<td>person</td>\n<td>no_transaction=True</td>\n</tr>\n</table>", "shortdoc": "Check if the table with `table_name` exists in the database.", "tags": [], "source": "/Users/andremochinin/DEV/Robotframework-Database-Library/src/DatabaseLibrary/assertion.py", "lineno": 416}], "typedocs": [{"type": "Standard", "name": "Any", "doc": "<p>Any value is accepted. No conversion is done.</p>", "usages": ["Check Query Result"], "accepts": ["Any"]}, {"type": "Enum", "name": "AssertionOperator", "doc": "<p>Currently supported assertion operators are:</p>\n<table border=\"1\">\n<tr>\n<th>Operator</th>\n<th>Alternative Operators</th>\n<th>Description</th>\n<th>Validate Equivalent</th>\n</tr>\n<tr>\n<td><code>==</code></td>\n<td><code>equal</code>, <code>equals</code>, <code>should be</code></td>\n<td>Checks if returned value is equal to expected value.</td>\n<td><code>value == expected</code></td>\n</tr>\n<tr>\n<td><code>!=</code></td>\n<td><code>inequal</code>, <code>should not be</code></td>\n<td>Checks if returned value is not equal to expected value.</td>\n<td><code>value != expected</code></td>\n</tr>\n<tr>\n<td><code>&gt;</code></td>\n<td><code>greater than</code></td>\n<td>Checks if returned value is greater than expected value.</td>\n<td><code>value &gt; expected</code></td>\n</tr>\n<tr>\n<td><code>&gt;=</code></td>\n<td></td>\n<td>Checks if returned value is greater than or equal to expected value.</td>\n<td><code>value &gt;= expected</code></td>\n</tr>\n<tr>\n<td><code>&lt;</code></td>\n<td><code>less than</code></td>\n<td>Checks if returned value is less than expected value.</td>\n<td><code>value &lt; expected</code></td>\n</tr>\n<tr>\n<td><code>&lt;=</code></td>\n<td></td>\n<td>Checks if returned value is less than or equal to expected value.</td>\n<td><code>value &lt;= expected</code></td>\n</tr>\n<tr>\n<td><code>*=</code></td>\n<td><code>contains</code></td>\n<td>Checks if returned value contains expected value as substring.</td>\n<td><code>expected in value</code></td>\n</tr>\n<tr>\n<td></td>\n<td><code>not contains</code></td>\n<td>Checks if returned value does not contain expected value as substring.</td>\n<td><code>expected in value</code></td>\n</tr>\n<tr>\n<td><code>^=</code></td>\n<td><code>should start with</code>, <code>starts</code></td>\n<td>Checks if returned value starts with expected value.</td>\n<td><code>re.search(f\"^{expected}\", value)</code></td>\n</tr>\n<tr>\n<td><code>$=</code></td>\n<td><code>should end with</code>, <code>ends</code></td>\n<td>Checks if returned value ends with expected value.</td>\n<td><code>re.search(f\"{expected}$\", value)</code></td>\n</tr>\n<tr>\n<td><code>matches</code></td>\n<td></td>\n<td>Checks if given RegEx matches minimum once in returned value.</td>\n<td><code>re.search(expected, value)</code></td>\n</tr>\n<tr>\n<td><code>validate</code></td>\n<td></td>\n<td>Checks if given Python expression evaluates to <code>True</code>.</td>\n<td></td>\n</tr>\n<tr>\n<td><code>evaluate</code></td>\n<td><code>then</code></td>\n<td>When using this operator, the keyword does return the evaluated Python expression.</td>\n<td></td>\n</tr>\n</table>\n<p>Currently supported formatters for assertions are:</p>\n<table border=\"1\">\n<tr>\n<th>Formatter</th>\n<th>Description</th>\n</tr>\n<tr>\n<td><code>normalize spaces</code></td>\n<td>Substitutes multiple spaces to single space from the value</td>\n</tr>\n<tr>\n<td><code>strip</code></td>\n<td>Removes spaces from the beginning and end of the value</td>\n</tr>\n<tr>\n<td><code>case insensitive</code></td>\n<td>Converts value to lower case before comparing</td>\n</tr>\n<tr>\n<td><code>apply to expected</code></td>\n<td>Applies rules also for the expected value</td>\n</tr>\n</table>\n<p>Formatters are applied to the value before assertion is performed and keywords returns a value where rule is applied. Formatter is only applied to the value which keyword returns and not all rules are valid for all assertion operators. If <code>apply to expected</code> formatter is defined, then formatters are then formatter are also applied to expected value.</p>", "usages": ["Check Query Result", "Check Row Count"], "accepts": ["string"], "members": [{"name": "equal", "value": "=="}, {"name": "equals", "value": "=="}, {"name": "==", "value": "=="}, {"name": "should be", "value": "=="}, {"name": "inequal", "value": "!="}, {"name": "!=", "value": "!="}, {"name": "should not be", "value": "!="}, {"name": "less than", "value": "<"}, {"name": "<", "value": "<"}, {"name": "greater than", "value": ">"}, {"name": ">", "value": ">"}, {"name": "<=", "value": "<="}, {"name": ">=", "value": ">="}, {"name": "contains", "value": "*="}, {"name": "not contains", "value": "not contains"}, {"name": "*=", "value": "*="}, {"name": "starts", "value": "^="}, {"name": "^=", "value": "^="}, {"name": "should start with", "value": "^="}, {"name": "ends", "value": "$="}, {"name": "should end with", "value": "$="}, {"name": "$=", "value": "$="}, {"name": "matches", "value": "$"}, {"name": "validate", "value": "validate"}, {"name": "then", "value": "then"}, {"name": "evaluate", "value": "then"}]}, {"type": "Standard", "name": "boolean", "doc": "<p>Strings <code>TRUE</code>, <code>YES</code>, <code>ON</code> and <code>1</code> are converted to Boolean <code>True</code>, the empty string as well as strings <code>FALSE</code>, <code>NO</code>, <code>OFF</code> and <code>0</code> are converted to Boolean <code>False</code>, and the string <code>NONE</code> is converted to the Python <code>None</code> object. Other strings and other accepted values are passed as-is, allowing keywords to handle them specially if needed. All string comparisons are case-insensitive.</p>\n<p>Examples: <code>TRUE</code> (converted to <code>True</code>), <code>off</code> (converted to <code>False</code>), <code>example</code> (used as-is)</p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Check Query Result", "Check Row Count", "Delete All Rows From Table", "Description", "Disconnect From Database", "Execute Sql Script", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X", "Set Auto Commit", "Set Logging Query Results", "Table Must Exist"], "accepts": ["string", "integer", "float", "None"]}, {"type": "Standard", "name": "integer", "doc": "<p>Conversion is done using Python's <a href=\"https://docs.python.org/library/functions.html#int\">int</a> built-in function. Floating point numbers are accepted only if they can be represented as integers exactly. For example, <code>1.0</code> is accepted and <code>1.1</code> is not.</p>\n<p>Starting from RF 4.1, it is possible to use hexadecimal, octal and binary numbers by prefixing values with <code>0x</code>, <code>0o</code> and <code>0b</code>, respectively.</p>\n<p>Starting from RF 4.1, spaces and underscores can be used as visual separators for digit grouping purposes.</p>\n<p>Examples: <code>42</code>, <code>-1</code>, <code>0b1010</code>, <code>10 000 000</code>, <code>0xBAD_C0FFEE</code></p>", "usages": ["Check Row Count", "Connect To Database", "Set Logging Query Results"], "accepts": ["string", "float"]}, {"type": "Standard", "name": "list", "doc": "<p>Strings must be Python <a href=\"https://docs.python.org/library/stdtypes.html#list\">list</a> literals. They are converted to actual lists using the <a href=\"https://docs.python.org/library/ast.html#ast.literal_eval\">ast.literal_eval</a> function. They can contain any values <code>ast.literal_eval</code> supports, including lists and other containers.</p>\n<p>If the type has nested types like <code>list[int]</code>, items are converted to those types automatically. This in new in Robot Framework 6.0.</p>\n<p>Examples: <code>['one', 'two']</code>, <code>[('one', 1), ('two', 2)]</code></p>", "usages": ["Call Stored Procedure"], "accepts": ["string", "Sequence"]}, {"type": "Standard", "name": "None", "doc": "<p>String <code>NONE</code> (case-insensitive) is converted to Python <code>None</code> object. Other values cause an error.</p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Check Query Result", "Check Row Count", "Connect To Database", "Connect To Database Using Custom Connection String", "Connect To Database Using Custom Params", "Delete All Rows From Table", "Description", "Disconnect From Database", "Execute Sql Script", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X", "Set Auto Commit", "Set Logging Query Results", "Table Must Exist"], "accepts": ["string"]}, {"type": "Standard", "name": "string", "doc": "<p>All arguments are converted to Unicode strings.</p>", "usages": ["Call Stored Procedure", "Check If Exists In Database", "Check If Not Exists In Database", "Check Query Result", "Check Row Count", "Connect To Database", "Connect To Database Using Custom Connection String", "Connect To Database Using Custom Params", "Delete All Rows From Table", "Description", "Disconnect From Database", "Execute Sql Script", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X", "Set Auto Commit", "Switch Database", "Table Must Exist"], "accepts": ["Any"]}, {"type": "Standard", "name": "tuple", "doc": "<p>Strings must be Python <a href=\"https://docs.python.org/library/stdtypes.html#tuple\">tuple</a> literals. They are converted to actual tuples using the <a href=\"https://docs.python.org/library/ast.html#ast.literal_eval\">ast.literal_eval</a> function. They can contain any values <code>ast.literal_eval</code> supports, including tuples and other containers.</p>\n<p>If the type has nested types like <code>tuple[str, int, int]</code>, items are converted to those types automatically. This in new in Robot Framework 6.0.</p>\n<p>Examples: <code>('one', 'two')</code>, <code>(('one', 1), ('two', 2))</code></p>", "usages": ["Check If Exists In Database", "Check If Not Exists In Database", "Check Query Result", "Check Row Count", "Description", "Execute Sql String", "Query", "Row Count", "Row Count Is 0", "Row Count Is Equal To X", "Row Count Is Greater Than X", "Row Count Is Less Than X"], "accepts": ["string", "Sequence"]}]}
 </script>
 <title></title>
 </head>
@@ -1699,13 +1710,23 @@ <h4>Arguments</h4>
                 </div>
               </div>
             {{/if}}
+            {{if returnType}}
+            <div class="return-type">
+              <h4>Return Type</h4>
+              <span class="arg-type">
+              {{tmpl(returnType) 'type-info-template'}}
+              </span>
+            </div>
+            {{/if}}
             {{if libdoc.tags.length && tags.length}}
               <div class="tags">
                 <h4>Tags</h4>
+                <span class="kw-tags">
                 {{each tags}}
                   <a href="javascript:tagSearch('${$value}')"
                     title="Show keywords with this tag">${$value}</a>{{if $index < tags.length-1}},<br>{{/if}}
                 {{/each}}
+                </span>
               </div>
             {{/if}}
           </div>
diff --git a/pyproject.toml b/pyproject.toml
index 2d05e7a..7a3d83a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,8 @@
 [build-system]
 requires = [
     "setuptools>=61.0",
-    "robotframework"
+    "robotframework>=5.0.1",
+    "robotframework-assertion-engine"
     ]
 build-backend = "setuptools.build_meta"
 
@@ -11,10 +12,11 @@ authors = [{name="Franz Allan Valencia See", email="franz.see@gmail.com"},
 ]
 description = "Database Library for Robot Framework"
 readme = "README.md"
-requires-python = ">=3.7"
+requires-python = ">=3.8.1"
 dependencies = [
-    "robotframework",
-    "robotframework-excellib"
+    "robotframework>=5.0.1",
+    "robotframework-excellib",
+    "robotframework-assertion-engine"
 ]
 classifiers = [
     "Programming Language :: Python :: 3",
diff --git a/requirements.txt b/requirements.txt
index a6421b7..0a7cdb7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,7 @@
 robotframework
 robotframework-excellib
+robotframework-assertion-engine
+psycopg2-binary
 pre-commit
 build
 twine
\ No newline at end of file
diff --git a/src/DatabaseLibrary/__init__.py b/src/DatabaseLibrary/__init__.py
index 1bf24f0..c89d9f8 100644
--- a/src/DatabaseLibrary/__init__.py
+++ b/src/DatabaseLibrary/__init__.py
@@ -27,17 +27,19 @@ class DatabaseLibrary(ConnectionManager, Query, Assertion):
     The Database Library for [https://robotframework.org|Robot Framework] allows you to query a database and verify the results.
     It requires an appropriate *Python module to be installed separately* - depending on your database, like e.g. `oracledb` or `pymysql`.
 
-    == Requirements ==
+    == Table of contents ==
+    %TOC%
+
+    = Requirements =
     - Python
     - Robot Framework
     - Python database module you're going to use - e.g. `oracledb`
 
-    == Installation ==
+    = Installation =
     | pip install robotframework-databaselibrary
     Don't forget to install the required Python database module!
 
-    == Usage example ==
-    === Basic usage ===
+    = Basic usage examples =
     | *** Settings ***
     | Library       DatabaseLibrary
     | Test Setup    Connect To My Oracle DB
@@ -46,26 +48,39 @@ class DatabaseLibrary(ConnectionManager, Query, Assertion):
     | Connect To My Oracle DB
     |     Connect To Database
     |     ...    oracledb
-    |     ...    dbName=db
-    |     ...    dbUsername=my_user
-    |     ...    dbPassword=my_pass
-    |     ...    dbHost=127.0.0.1
-    |     ...    dbPort=1521
+    |     ...    db_name=db
+    |     ...    db_user=my_user
+    |     ...    db_password=my_pass
+    |     ...    db_host=127.0.0.1
+    |     ...    db_port=1521
     |
     | *** Test Cases ***
+    | Get All Names
+    |     ${Rows}=    Query    select FIRST_NAME, LAST_NAME from person
+    |     Should Be Equal    ${Rows}[0][0]    Franz Allan
+    |     Should Be Equal    ${Rows}[0][1]    See
+    |     Should Be Equal    ${Rows}[1][0]    Jerry
+    |     Should Be Equal    ${Rows}[1][1]    Schneider
+    |
     | Person Table Contains Expected Records
-    |     ${output}=    Query    select LAST_NAME from person
-    |     Length Should Be    ${output}    2
-    |     Should Be Equal    ${output}[0][0]    See
-    |     Should Be Equal    ${output}[1][0]    Schneider
+    |     ${sql}=    Catenate    select LAST_NAME from person
+    |     Check Query Result    ${sql}    contains    See
+    |     Check Query Result    ${sql}    equals      Schneider    row=1
+    |
+    | Wait Until Table Gets New Record
+    |     ${sql}=    Catenate    select LAST_NAME from person
+    |     Check Row Count    ${sql}    >    2    retry_timeout=5s
     |
     | Person Table Contains No Joe
     |     ${sql}=    Catenate    SELECT id FROM person
     |     ...                    WHERE FIRST_NAME= 'Joe'
-    |     Check If Not Exists In Database    ${sql}
+    |     Check Row Count    ${sql}   ==    0
     |
 
-    === Handling multiple database connections ===
+    = Handling multiple database connections =
+    The library can handle multiple connections to different databases using *aliases*.
+    An alias is set while creating a connection and can be passed to library keywords in a corresponding argument.
+    == Example ==
     | *** Settings ***
     | Library          DatabaseLibrary
     | Test Setup       Connect To All Databases
@@ -73,9 +88,21 @@ class DatabaseLibrary(ConnectionManager, Query, Assertion):
     |
     | *** Keywords ***
     | Connect To All Databases
-    |     Connect To Database    psycopg2    db    db_user    pass    127.0.0.1    5432
+    |     Connect To Database
+    |     ...    psycopg2
+    |     ...    db_name=db
+    |     ...    db_user=db_user
+    |     ...    db_password=pass
+    |     ...    db_host=127.0.0.1
+    |     ...    db_port=5432
     |     ...    alias=postgres
-    |     Connect To Database    pymysql    db    db_user    pass    127.0.0.1    3306
+    |     Connect To Database
+    |     ...    pymysql
+    |     ...    db_name=db
+    |     ...    db_user=db_user
+    |     ...    db_password=pass
+    |     ...    db_host=127.0.0.1
+    |     ...    db_port=3306
     |     ...    alias=mysql
     |
     | *** Test Cases ***
@@ -89,13 +116,164 @@ class DatabaseLibrary(ConnectionManager, Query, Assertion):
     |     Switch Database    mysql
     |     Execute Sql String    drop table XYZ
     |
-    == Database modules compatibility ==
+
+    = Using configuration file =
+    The `Connect To Database` keyword allows providing the connection parameters in two ways:
+    - As keyword arguments
+    - In a configuration file - a simple list of _key=value_ pairs, set inside an _alias_ section.
+
+    You can use only one way or you can combine them:
+    - The keyword arguments are taken by default
+    - If no keyword argument is provided, a parameter value is searched in the config file
+
+    Along with commonly used connection parameters, named exactly as keyword arguments, a config file
+    can contain any other DB module specific parameters as key/value pairs.
+    If same custom parameter is provided both as a keyword argument *and* in config file,
+    the *keyword argument value takes precedence*.
+
+    The path to the config file is set by default to `./resources/db.cfg`.
+    You can change it using an according parameter in the `Connect To Database` keyword.
+
+    A config file *must* contain at least one section name -
+    the connection alias, if used (see `Handling multiple database connections`), or
+    `[default]` if no aliases are used.
+
+    == Config file examples ==
+    === Config file with default alias (equal to using no aliases at all) ===
+    | [default]
+    | db_module=psycopg2
+    | db_name=yourdbname
+    | db_user=yourusername
+    | db_password=yourpassword
+    | db_host=yourhost
+    | db_port=yourport
+
+    === Config file with a specific alias ===
+    | [myoracle]
+    | db_module=oracledb
+    | db_name=yourdbname
+    | db_user=yourusername
+    | db_password=yourpassword
+    | db_host=yourhost
+    | db_port=yourport
+
+    === Config file with some params only ===
+    | [default]
+    | db_password=mysecret
+
+    === Config file with some custom DB module specific params ===
+    | [default]
+    | my_custom_param=value
+
+
+    = Inline assertions =
+    Keywords, that accept arguments ``assertion_operator`` <`AssertionOperator`> and ``expected_value``,
+    perform a check according to the specified condition - using the [https://github.com/MarketSquare/AssertionEngine|Assertion Engine].
+
+    Examples:
+    | Check Row Count | SELECT id FROM person | *==* | 2 |
+    | Check Query Result | SELECT first_name FROM person | *contains* | Allan |
+
+    = Retry mechanism =
+    Assertion keywords, that accept arguments ``retry_timeout`` and ``retry_pause``, support waiting for assertion to pass.
+
+    Setting the ``retry_timeout`` argument enables the mechanism -
+    in this case the SQL request and the assertion are executed in a loop,
+    until the assertion is passed or the ``retry_timeout`` is reached.
+    The pause between the loop iterations is set using the ``retry_pause`` argument.
+
+    The argument values are set in [http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#time-format|Robot Framework time format] -
+    e.g. ``5 seconds``.
+
+    The retry mechanism is disabled by default - ``retry_timeout`` is set to ``0``.
+
+    Examples:
+    | Check Row Count | SELECT id FROM person | *==* | 2 | retry_timeout=10 seconds |
+    | Check Query Result | SELECT first_name FROM person | *contains* | Allan | retry_timeout=5s | retry_pause=1s |
+
+    = Logging query results =
+    Keywords, that fetch results of a SQL query, print the result rows as a table in RF log.
+    - A log head limit of *50 rows* is applied, other table rows are truncated in the log message.
+    - The limit and the logging in general can be adjusted any time in your tests using the Keyword `Set Logging Query Results`.
+
+    You can also setup the limit or disable the logging during the library import.
+    Examples:
+
+    | *** Settings ***
+    | # Default behavior - logging of query results is enabled, log head is 50 rows.
+    | Library    DatabaseLibrary
+    |
+    | # Logging of query results is disabled, log head is 50 rows (default).
+    | Library    DatabaseLibrary    log_query_results=False
+    |
+    | # Logging of query results is enabled (default), log head is 10 rows.
+    | Library    DatabaseLibrary    log_query_results_head=10
+    |
+    | # Logging of query results is enabled (default), log head limit is disabled (log all rows).
+    | Library    DatabaseLibrary    log_query_results_head=0
+
+    = Commit behavior =
+    While creating a database connection, the library doesn't explicitly set the _autocommit_ behavior -
+    so the default value of the Python DB module is used.
+    According to Python DB API specification it should be disabled by default -
+    which means each SQL transaction must contain a dedicated commit statement, if necessary.
+
+    The library manages it for you:
+    - Keywords like `Execute SQL String` perform automatically a commit after running the query - or a rollback in case of error
+    - Keywords like `Query` don't perform a commit, but also do a rollback in case of error
+
+    You can turn off this automatic commit/rollback behavior using the ``no_transaction`` parameter.
+    See docs of a particular keyword.
+
+    It's also possible to explicitly set the _autocommit_ behavior on the Python DB module level -
+    using the `Set Auto Commit` keyword.
+    This has no impact on the automatic commit/rollback behavior in library keywords (described above).
+
+    = Database modules compatibility =
     The library is basically compatible with any [https://peps.python.org/pep-0249|Python Database API Specification 2.0] module.
 
     However, the actual implementation in existing Python modules is sometimes quite different, which requires custom handling in the library.
     Therefore, there are some modules, which are "natively" supported in the library - and others, which may work and may not.
 
-    See more on the [https://github.com/MarketSquare/Robotframework-Database-Library|project page on GitHub].
+    == Python modules currently "natively" supported ==
+    === Oracle ===
+    [https://oracle.github.io/python-oracledb/|oracledb]
+    - Both thick and thin client modes are supported - you can select one using the `oracle_driver_mode` parameter.
+    - However, due to current limitations of the oracledb module, **it's not possible to switch between thick and thin modes during a test execution session** - even in different suites.
+
+    [https://oracle.github.io/python-cx_Oracle/|cx_Oracle]
+
+    === MySQL ===
+    - [https://github.com/PyMySQL/PyMySQL|pymysql]
+    - [https://mysqlclient.readthedocs.io/index.html|MySQLdb]
+    === PostgreSQL ===
+    - [https://www.psycopg.org/docs/|psycopg2]
+    === MS SQL Server ===
+    - [https://github.com/pymssql/pymssql|pymssql]
+    === SQLite ===
+    - [https://docs.python.org/3/library/sqlite3.html|sqlite3]
+    === Teradata ===
+    - [https://github.com/teradata/PyTd|teradata]
+    === IBM DB2 ===
+    - [https://github.com/ibmdb/python-ibmdb|ibm_db]
+    - [https://github.com/ibmdb/python-ibmdb|ibm_db_dbi]
+    === ODBC ===
+    - [https://github.com/mkleehammer/pyodbc|pyodbc]
+    - [https://github.com/pypyodbc/pypyodbc|pypyodbc]
+    === Kingbase ===
+    - ksycopg2
     """
 
     ROBOT_LIBRARY_SCOPE = "GLOBAL"
+
+    def __init__(self, log_query_results=True, log_query_results_head=50):
+        """
+        The library can be imported without any arguments:
+        | *** Settings ***
+        | Library    DatabaseLibrary
+        Use optional library import parameters to disable `Logging query results` or setup the log head.
+        """
+        ConnectionManager.__init__(self)
+        if log_query_results_head < 0:
+            raise ValueError(f"Wrong log head value provided: {log_query_results_head}. The value can't be negative!")
+        Query.__init__(self, log_query_results=log_query_results, log_query_results_head=log_query_results_head)
diff --git a/src/DatabaseLibrary/assertion.py b/src/DatabaseLibrary/assertion.py
index 88d1a91..3d2fd56 100644
--- a/src/DatabaseLibrary/assertion.py
+++ b/src/DatabaseLibrary/assertion.py
@@ -11,9 +11,14 @@
 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
-from typing import Optional, Tuple
+from typing import Any, Optional, Tuple
 
+from assertionengine import AssertionOperator, verify_assertion
 from robot.api import logger
+from robot.libraries.BuiltIn import BuiltIn
+from robot.utils import timestr_to_secs
+
+from .params_decorator import renamed_args
 
 
 class Assertion:
@@ -23,17 +28,21 @@ class Assertion:
 
     def check_if_exists_in_database(
         self,
-        selectStatement: str,
-        sansTran: bool = False,
+        select_statement: str,
+        *,
+        no_transaction: bool = False,
         msg: Optional[str] = None,
         alias: Optional[str] = None,
         parameters: Optional[Tuple] = None,
     ):
         """
-        Check if any row would be returned by given the input ``selectStatement``. If there are no results, then this will
+        *DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead.
+        The deprecated keyword will be removed in future versions.
+
+        Check if any row would be returned by given the input ``select_statement``. If there are no results, then this will
         throw an AssertionError.
 
-        Set optional input ``sansTran`` to _True_ to run command without an explicit transaction
+        Set optional input ``no_transaction`` to _True_ to run command without an explicit transaction
         commit or rollback.
 
         The default error message can be overridden with the ``msg`` argument.
@@ -41,21 +50,20 @@ def check_if_exists_in_database(
         Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
         than one connection open.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
         depending on the database client).
 
         Examples:
         | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'Franz Allan' |
         | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'John' | msg=my error message |
         | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'Franz Allan' | alias=my_alias |
-        | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'John' | sansTran=True |
+        | Check If Exists In Database | SELECT id FROM person WHERE first_name = 'John' | no_transaction=True |
         | @{parameters} | Create List |  John |
         | Check If Exists In Database | SELECT id FROM person WHERE first_name = %s | parameters=${parameters} |
         """
-        logger.info(f"Executing : Check If Exists In Database  |  {selectStatement}")
-        if not self.query(selectStatement, sansTran, alias=alias, parameters=parameters):
+        if not self.query(select_statement, no_transaction, alias=alias, parameters=parameters):
             raise AssertionError(
-                msg or f"Expected to have have at least one row, but got 0 rows from: '{selectStatement}'"
+                msg or f"Expected to have have at least one row, but got 0 rows from: '{select_statement}'"
             )
 
     def check_if_not_exists_in_database(
@@ -67,6 +75,9 @@ def check_if_not_exists_in_database(
         parameters: Optional[Tuple] = None,
     ):
         """
+        *DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead.
+        The deprecated keyword will be removed in future versions.
+
         This is the negation of `check_if_exists_in_database`.
 
         Check if no rows would be returned by given the input ``selectStatement``. If there are any results, then this
@@ -79,7 +90,7 @@ def check_if_not_exists_in_database(
         Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
         than one connection open.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
         depending on the database client).
 
         Examples:
@@ -90,7 +101,6 @@ def check_if_not_exists_in_database(
         | @{parameters} | Create List |  John |
         | Check If Not Exists In Database | SELECT id FROM person WHERE first_name = %s | parameters=${parameters} |
         """
-        logger.info(f"Executing : Check If Not Exists In Database  |  {selectStatement}")
         query_results = self.query(selectStatement, sansTran, alias=alias, parameters=parameters)
         if query_results:
             raise AssertionError(
@@ -106,6 +116,9 @@ def row_count_is_0(
         parameters: Optional[Tuple] = None,
     ):
         """
+        *DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead.
+        The deprecated keyword will be removed in future versions.
+
         Check if any rows are returned from the submitted ``selectStatement``. If there are, then this will throw an
         AssertionError.
 
@@ -117,7 +130,7 @@ def row_count_is_0(
         Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
         than one connection open.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
         depending on the database client).
 
         Examples:
@@ -128,7 +141,6 @@ def row_count_is_0(
         | @{parameters} | Create List |  John |
         | Row Count is 0 | SELECT id FROM person WHERE first_name = %s | parameters=${parameters} |
         """
-        logger.info(f"Executing : Row Count Is 0  |  {selectStatement}")
         num_rows = self.row_count(selectStatement, sansTran, alias=alias, parameters=parameters)
         if num_rows > 0:
             raise AssertionError(msg or f"Expected 0 rows, but {num_rows} were returned from: '{selectStatement}'")
@@ -143,6 +155,9 @@ def row_count_is_equal_to_x(
         parameters: Optional[Tuple] = None,
     ):
         """
+        *DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead.
+        The deprecated keyword will be removed in future versions.
+
         Check if the number of rows returned from ``selectStatement`` is equal to the value submitted. If not, then this
         will throw an AssertionError.
 
@@ -153,7 +168,7 @@ def row_count_is_equal_to_x(
         Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
         than one connection open.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
         depending on the database client).
 
         Examples:
@@ -164,7 +179,6 @@ def row_count_is_equal_to_x(
         | @{parameters} | Create List |  John |
         | Row Count Is Equal To X | SELECT id FROM person WHERE first_name = %s | 0 | parameters=${parameters} |
         """
-        logger.info(f"Executing : Row Count Is Equal To X  |  {selectStatement}  |  {numRows}")
         num_rows = self.row_count(selectStatement, sansTran, alias=alias, parameters=parameters)
         if num_rows != int(numRows.encode("ascii")):
             raise AssertionError(
@@ -181,6 +195,9 @@ def row_count_is_greater_than_x(
         parameters: Optional[Tuple] = None,
     ):
         """
+        *DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead.
+        The deprecated keyword will be removed in future versions.
+
         Check if the number of rows returned from ``selectStatement`` is greater than the value submitted. If not, then
         this will throw an AssertionError.
 
@@ -191,7 +208,7 @@ def row_count_is_greater_than_x(
         Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
         than one connection open.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
         depending on the database client).
 
         Examples:
@@ -202,7 +219,6 @@ def row_count_is_greater_than_x(
         | @{parameters} | Create List |  John |
         | Row Count Is Greater Than X | SELECT id FROM person WHERE first_name = %s | 0 | parameters=${parameters} |
         """
-        logger.info(f"Executing : Row Count Is Greater Than X  |  {selectStatement}  |  {numRows}")
         num_rows = self.row_count(selectStatement, sansTran, alias=alias, parameters=parameters)
         if num_rows <= int(numRows.encode("ascii")):
             raise AssertionError(
@@ -219,6 +235,9 @@ def row_count_is_less_than_x(
         parameters: Optional[Tuple] = None,
     ):
         """
+        *DEPRECATED* Use new `Check Row Count` keyword with assertion engine instead.
+        The deprecated keyword will be removed in future versions.
+
         Check if the number of rows returned from ``selectStatement`` is less than the value submitted. If not, then this
         will throw an AssertionError.
 
@@ -229,7 +248,7 @@ def row_count_is_less_than_x(
         Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
         than one connection open.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
         depending on the database client).
 
         Examples:
@@ -240,60 +259,218 @@ def row_count_is_less_than_x(
         | @{parameters} | Create List |  John |
         | Row Count Is Less Than X | SELECT id FROM person WHERE first_name = %s | 5 | parameters=${parameters} |
         """
-        logger.info(f"Executing : Row Count Is Less Than X  |  {selectStatement}  |  {numRows}")
         num_rows = self.row_count(selectStatement, sansTran, alias=alias, parameters=parameters)
         if num_rows >= int(numRows.encode("ascii")):
             raise AssertionError(
                 msg or f"Expected less than {numRows} rows, but {num_rows} were returned from '{selectStatement}'"
             )
 
+    @renamed_args(mapping={"selectStatement": "select_statement", "sansTran": "no_transaction"})
+    def check_row_count(
+        self,
+        select_statement: str,
+        assertion_operator: AssertionOperator,
+        expected_value: int,
+        assertion_message: Optional[str] = None,
+        no_transaction: bool = False,
+        alias: Optional[str] = None,
+        parameters: Optional[Tuple] = None,
+        retry_timeout="0 seconds",
+        retry_pause="0.5 seconds",
+        *,
+        selectStatement: Optional[str] = None,
+        sansTran: Optional[bool] = None,
+    ):
+        """
+        Check the number of rows returned from ``select_statement`` using ``assertion_operator``
+        and ``expected_value``. See `Inline assertions` for more details.
+
+        Use ``assertion_message`` to override the default error message.
+
+        Set ``no_transaction`` to _True_ to run command without explicit transaction rollback in case of error.
+        See `Commit behavior` for details.
+
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
+
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
+        depending on the database client).
+
+        Use ``retry_timeout`` and ``retry_pause`` parameters to enable waiting for assertion to pass.
+        See `Retry mechanism` for more details.
+
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``selectStatement`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``select_statement`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
+        | Check Row Count | SELECT id FROM person WHERE first_name = 'John' | *==* | 1 |
+        | Check Row Count | SELECT id FROM person WHERE first_name = 'John' | *>=* | 2 | assertion_message=my error message |
+        | Check Row Count | SELECT id FROM person WHERE first_name = 'John' | *inequal* | 3 | alias=my_alias |
+        | Check Row Count | SELECT id FROM person WHERE first_name = 'John' | *less than* | 4 | no_transaction=True |
+        | @{parameters} | Create List |  John |
+        | Check Row Count | SELECT id FROM person WHERE first_name = %s | *equals* | 5 | parameters=${parameters} |
+        """
+        check_ok = False
+        time_counter = 0
+        while not check_ok:
+            try:
+                num_rows = self.row_count(
+                    select_statement, no_transaction=no_transaction, alias=alias, parameters=parameters
+                )
+                verify_assertion(num_rows, assertion_operator, expected_value, "Wrong row count:", assertion_message)
+                check_ok = True
+            except AssertionError as e:
+                if time_counter >= timestr_to_secs(retry_timeout):
+                    logger.info(f"Timeout '{retry_timeout}' reached")
+                    raise e
+                BuiltIn().sleep(retry_pause)
+                time_counter += timestr_to_secs(retry_pause)
+
+    @renamed_args(mapping={"selectStatement": "select_statement", "sansTran": "no_transaction"})
+    def check_query_result(
+        self,
+        select_statement: str,
+        assertion_operator: AssertionOperator,
+        expected_value: Any,
+        row=0,
+        col=0,
+        assertion_message: Optional[str] = None,
+        no_transaction: bool = False,
+        alias: Optional[str] = None,
+        parameters: Optional[Tuple] = None,
+        retry_timeout="0 seconds",
+        retry_pause="0.5 seconds",
+        *,
+        selectStatement: Optional[str] = None,
+        sansTran: Optional[bool] = None,
+    ):
+        """
+        Check value in query result returned from ``select_statement`` using ``assertion_operator`` and ``expected_value``.
+        The value position in results can be adjusted using ``row`` and ``col`` parameters (0-based).
+        See `Inline assertions` for more details.
+
+        *The assertion in this keyword is type sensitive!*
+        The ``expected_value`` is taken as a string, no argument conversion is performed.
+        Use RF syntax like ``${1}`` for numeric values.
+
+        Use optional ``assertion_message`` to override the default error message.
+
+        Set ``no_transaction`` to _True_ to run command without explicit transaction rollback in case of error.
+        See `Commit behavior` for details.
+
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
+
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
+        depending on the database client).
+
+        Use ``retry_timeout`` and ``retry_pause`` parameters to enable waiting for assertion to pass.
+        See `Retry mechanism` for more details.
+
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``selectStatement`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``select_statement`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
+        | Check Query Result | SELECT first_name FROM person | *contains* | Allan |
+        | Check Query Result | SELECT first_name, last_name FROM person | *==* | Schneider | row=1 | col=1 |
+        | Check Query Result | SELECT id FROM person WHERE first_name = 'John' | *==* | 2 | # Fails, if query returns an integer value |
+        | Check Query Result | SELECT id FROM person WHERE first_name = 'John' | *==* | ${2} | # Works, if query returns an integer value |
+        | Check Query Result | SELECT first_name FROM person | *equal* | Franz Allan | assertion_message=my error message |
+        | Check Query Result | SELECT first_name FROM person | *inequal* | John | alias=my_alias |
+        | Check Query Result | SELECT first_name FROM person | *contains* | Allan | no_transaction=True |
+        | @{parameters} | Create List |  John |
+        | Check Query Result | SELECT first_name FROM person | *contains* | Allan | parameters=${parameters} |
+        """
+        check_ok = False
+        time_counter = 0
+        while not check_ok:
+            try:
+                query_results = self.query(
+                    select_statement, no_transaction=no_transaction, alias=alias, parameters=parameters
+                )
+                row_count = len(query_results)
+                assert (
+                    row < row_count
+                ), f"Checking row '{row}' is not possible, as query results contain {row_count} rows only!"
+                col_count = len(query_results[row])
+                assert (
+                    col < col_count
+                ), f"Checking column '{col}' is not possible, as query results contain {col_count} columns only!"
+                actual_value = query_results[row][col]
+                verify_assertion(
+                    actual_value, assertion_operator, expected_value, "Wrong query result:", assertion_message
+                )
+                check_ok = True
+            except AssertionError as e:
+                if time_counter >= timestr_to_secs(retry_timeout):
+                    logger.info(f"Timeout '{retry_timeout}' reached")
+                    raise e
+                BuiltIn().sleep(retry_pause)
+                time_counter += timestr_to_secs(retry_pause)
+
+    @renamed_args(mapping={"tableName": "table_name", "sansTran": "no_transaction"})
     def table_must_exist(
-        self, tableName: str, sansTran: bool = False, msg: Optional[str] = None, alias: Optional[str] = None
+        self,
+        table_name: str,
+        no_transaction: bool = False,
+        msg: Optional[str] = None,
+        alias: Optional[str] = None,
+        *,
+        tableName: Optional[str] = None,
+        sansTran: Optional[bool] = None,
     ):
         """
-        Check if the given table exists in the database.
+        Check if the table with `table_name` exists in the database.
 
-        Set optional input ``sansTran`` to True to run command without an
-        explicit transaction commit or rollback.
+        Use ``msg`` for custom error message.
 
-        The default error message can be overridden with the ``msg`` argument.
+        Set ``no_transaction`` to _True_ to run command without explicit transaction rollback in case of error.
+        See `Commit behavior` for details.
 
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        Examples:
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``tableName`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``table_name`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
         | Table Must Exist | person |
         | Table Must Exist | person | msg=my error message |
         | Table Must Exist | person | alias=my_alias |
-        | Table Must Exist | person | sansTran=True |
+        | Table Must Exist | person | no_transaction=True |
         """
-        logger.info(f"Executing : Table Must Exist  |  {tableName}")
         db_connection = self.connection_store.get_connection(alias)
         if db_connection.module_name in ["cx_Oracle", "oracledb"]:
             query = (
                 "SELECT * FROM all_objects WHERE object_type IN ('TABLE','VIEW') AND "
-                f"owner = SYS_CONTEXT('USERENV', 'SESSION_USER') AND object_name = UPPER('{tableName}')"
+                f"owner = SYS_CONTEXT('USERENV', 'SESSION_USER') AND object_name = UPPER('{table_name}')"
             )
-            table_exists = self.row_count(query, sansTran, alias=alias) > 0
+            table_exists = self.row_count(query, no_transaction=no_transaction, alias=alias) > 0
         elif db_connection.module_name in ["sqlite3"]:
-            query = f"SELECT name FROM sqlite_master WHERE type='table' AND name='{tableName}' COLLATE NOCASE"
-            table_exists = self.row_count(query, sansTran, alias=alias) > 0
+            query = f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}' COLLATE NOCASE"
+            table_exists = self.row_count(query, no_transaction=no_transaction, alias=alias) > 0
         elif db_connection.module_name in ["ibm_db", "ibm_db_dbi"]:
-            query = f"SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('{tableName}')"
-            table_exists = self.row_count(query, sansTran, alias=alias) > 0
+            query = f"SELECT name FROM SYSIBM.SYSTABLES WHERE type='T' AND name=UPPER('{table_name}')"
+            table_exists = self.row_count(query, no_transaction=no_transaction, alias=alias) > 0
         elif db_connection.module_name in ["teradata"]:
-            query = f"SELECT TableName FROM DBC.TablesV WHERE TableKind='T' AND TableName='{tableName}'"
-            table_exists = self.row_count(query, sansTran, alias=alias) > 0
+            query = f"SELECT TableName FROM DBC.TablesV WHERE TableKind='T' AND TableName='{table_name}'"
+            table_exists = self.row_count(query, no_transaction=no_transaction, alias=alias) > 0
         else:
             try:
-                query = f"SELECT * FROM information_schema.tables WHERE table_name='{tableName}'"
-                table_exists = self.row_count(query, sansTran, alias=alias) > 0
+                query = f"SELECT * FROM information_schema.tables WHERE table_name='{table_name}'"
+                table_exists = self.row_count(query, no_transaction=no_transaction, alias=alias) > 0
             except:
                 logger.info("Database doesn't support information schema, try using a simple SQL request")
                 try:
-                    query = f"SELECT 1 from {tableName} where 1=0"
-                    self.row_count(query, sansTran, alias=alias)
+                    query = f"SELECT 1 from {table_name} where 1=0"
+                    self.row_count(query, no_transaction=no_transaction, alias=alias)
                     table_exists = True
                 except:
                     table_exists = False
-        assert table_exists, msg or f"Table '{tableName}' does not exist in the db"
+        assert table_exists, msg or f"Table '{table_name}' does not exist in the db"
diff --git a/src/DatabaseLibrary/connection_manager.py b/src/DatabaseLibrary/connection_manager.py
index 18c042b..8184a6b 100644
--- a/src/DatabaseLibrary/connection_manager.py
+++ b/src/DatabaseLibrary/connection_manager.py
@@ -20,6 +20,8 @@
 
 from robot.api import logger
 
+from .params_decorator import renamed_args
+
 
 @dataclass
 class Connection:
@@ -88,23 +90,48 @@ def __init__(self, config_file: Optional[str], alias: str):
     @staticmethod
     def _load_config(config_file: str) -> Optional[ConfigParser]:
         config_path = Path(config_file)
+        logger.info(f"Looking for configuration file: '{config_path}'")
         if not config_path.exists():
+            logger.info("Configuration file doesn't exist")
             return None
         config = ConfigParser()
         config.read([config_path])
+        logger.info("Successfully loaded configuration file")
         return config
 
-    def get(self, param: str) -> str:
+    def pop(self, param: str) -> Optional[str]:
+        """
+        Returns the `param` value read from the config file and deletes it from the list of all params read
+        """
         if self.config is None:
-            raise ValueError(f"Required '{param}' parameter was not provided in keyword arguments.") from None
+            logger.debug("Configuration file not loaded")
+            return None
         try:
-            return self.config.get(self.alias, param)
+            logger.debug(f"Looking for parameter '{param}' in configuration file")
+            param_value = self.config.get(self.alias, param)
+            logger.info(f"Found parameter '{param}' in configuration file")
+            self.config.remove_option(self.alias, param)
+            return param_value
         except NoSectionError:
-            raise ValueError(f"Configuration file does not have [{self.alias}] section.") from None
+            logger.debug(f"Configuration file does not have [{self.alias}] section.")
         except NoOptionError:
-            raise ValueError(
-                f"Required '{param}' parameter missing in both keyword arguments and configuration file."
-            ) from None
+            logger.debug(f"Parameter '{param}' missing in configuration file.")
+            return None
+
+    def get_all_available_params(self) -> Dict:
+        """
+        Returns a dictionary of all params read from the config file, which are currently available
+        (some of them might have been removed using the `pop` function)
+        """
+        if self.config is None:
+            logger.debug("Configuration file not loaded")
+            return {}
+        try:
+            all_options = dict(self.config.items(self.alias))
+            return all_options
+        except NoSectionError:
+            logger.debug(f"Configuration file does not have [{self.alias}] section.")
+            return {}
 
 
 class ConnectionManager:
@@ -116,169 +143,290 @@ def __init__(self):
         self.omit_trailing_semicolon: bool = False
         self.connection_store: ConnectionStore = ConnectionStore()
 
+    @staticmethod
+    def _hide_password_values(string_with_pass, params_separator=","):
+        string_with_hidden_pass = string_with_pass
+        for pass_param_name in ["pass", "passwd", "password", "pwd", "PWD"]:
+            pass_param_name += "="
+            splitted = string_with_hidden_pass.split(pass_param_name)
+            if len(splitted) < 2:
+                continue
+            splitted = splitted[1].split(params_separator)
+            value_to_hide = splitted[0]
+            string_with_hidden_pass = string_with_hidden_pass.replace(
+                f"{pass_param_name}{value_to_hide}", f"{pass_param_name}***"
+            )
+        return string_with_hidden_pass
+
+    @renamed_args(
+        mapping={
+            "dbapiModuleName": "db_module",
+            "dbName": "db_name",
+            "dbUsername": "db_user",
+            "dbPassword": "db_password",
+            "dbHost": "db_host",
+            "dbPort": "db_port",
+            "dbCharset": "db_charset",
+            "dbDriver": "odbc_driver",
+            "dbConfigFile": "config_file",
+            "driverMode": "oracle_driver_mode",
+        }
+    )
     def connect_to_database(
         self,
-        dbapiModuleName: Optional[str] = None,
-        dbName: Optional[str] = None,
-        dbUsername: Optional[str] = None,
-        dbPassword: Optional[str] = None,
-        dbHost: Optional[str] = None,
-        dbPort: Optional[int] = None,
-        dbCharset: Optional[str] = None,
-        dbDriver: Optional[str] = None,
-        dbConfigFile: Optional[str] = None,
-        driverMode: Optional[str] = None,
+        db_module: Optional[str] = None,
+        db_name: Optional[str] = None,
+        db_user: Optional[str] = None,
+        db_password: Optional[str] = None,
+        db_host: Optional[str] = None,
+        db_port: Optional[int] = None,
+        db_charset: Optional[str] = None,
+        odbc_driver: Optional[str] = None,
+        config_file: Optional[str] = None,
+        oracle_driver_mode: Optional[str] = None,
         alias: str = "default",
+        **custom_connection_params,
     ):
         """
-        Loads the DB API 2.0 module given ``dbapiModuleName`` then uses it to
-        connect to the database using provided parameters such as ``dbName``, ``dbUsername``, and ``dbPassword``.
-
-        Optional ``alias`` parameter can be used for creating multiple open connections, even for different databases.
-        If the same alias is given twice then previous connection will be overriden.
-
-        The ``driverMode`` is used to select the *oracledb* client mode.
+        Creates a database connection using the DB API 2.0 ``db_module`` and the parameters provided.
+        Along with listed commonly used arguments (`db_name`, `db_host` etc.)
+        you can set any other DB module specific parameters as key/value pairs.
+
+        Use ``config_file`` to provide a path to configuration file with connection parameters
+        to be used along with / instead of keyword arguments.
+        If no specified, it defaults to `./resources/db.cfg`.
+        See `Using configuration file` for more details.
+
+        All params are optional, although ``db_module`` must be set - either as keyword argument or in config file.
+        If some of the listed keyword arguments (`db_name`, `db_host` etc.) are not provided (i.e. left on default value `None`),
+        they are normally not passed to the Python DB module at all, except:
+        - _db_port_ - commonly used port number for known databases is set as fallback
+        - _db_charset_ - _UTF8_ is used as fallback for _pymysql_, _pymssql_ and _pyodbc_
+        - _oracle_driver_mode_ - _thin_ is used as fallback for _oracledb_
+
+        Other custom params from keyword arguments and config file are passed to the Python DB module as provided -
+        normally as arguments for the _connect()_ function.
+        However, when using *pyodbc* or *ibm_db*, the connection is established using a *connection string* -
+        so all the custom params are added into it instead of function arguments.
+
+        Set ``alias`` for `Handling multiple database connections`.
+        If the same alias is given twice, then previous connection will be overridden.
+
+        The ``oracle_driver_mode`` is used to select the *oracledb* client mode.
         Allowed values are:
         - _thin_ (default if omitted)
         - _thick_
         - _thick,lib_dir=<PATH_TO_ORACLE_CLIENT>_
 
-        Optionally, you can specify a ``dbConfigFile`` wherein it will load the
-        alias (or alias will be "default") property values for ``dbapiModuleName``, ``dbName`` ``dbUsername``
-        and ``dbPassword`` (note: specifying ``dbapiModuleName``, ``dbName``
-        `dbUsername` or `dbPassword` directly will override the properties of
-        the same key in `dbConfigFile`). If no `dbConfigFile` is specified, it
-        defaults to `./resources/db.cfg`.
-
-        The `dbConfigFile` is useful if you don't want to check into your SCM
-        your database credentials.
-
-        Example db.cfg file
-        | [alias]
-        | dbapiModuleName=pymysqlforexample
-        | dbName=yourdbname
-        | dbUsername=yourusername
-        | dbPassword=yourpassword
-        | dbHost=yourhost
-        | dbPort=yourport
-
-        Example usage:
-        | # explicitly specifies all db property values |
-        | Connect To Database | psycopg2 | my_db | postgres | s3cr3t | tiger.foobar.com | 5432 |
-        | Connect To Database | psycopg2 | my_db | postgres | s3cr3t | tiger.foobar.com | 5432 | alias=my_alias |
-
-        | # loads all property values from default.cfg |
-        | Connect To Database | dbConfigFile=default.cfg |
-
-        | # loads all property values from ./resources/db.cfg |
-        | Connect To Database |
-
-        | # uses explicit `dbapiModuleName` and `dbName` but uses the `dbUsername` and `dbPassword` in 'default.cfg' |
-        | Connect To Database | psycopg2 | my_db_test | dbConfigFile=default.cfg |
-
-        | # uses explicit `dbapiModuleName` and `dbName` but uses the `dbUsername` and `dbPassword` in './resources/db.cfg' |
-        | Connect To Database | psycopg2 | my_db_test |
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``dbapiModuleName``, ``dbName``, ``dbUsername``,
+        ``dbPassword``, ``dbHost``, ``dbPort``, ``dbCharset``, ``dbDriver``,
+        ``dbConfigFile`` and ``driverMode`` are *deprecated*,
+        please use new parameters ``db_module``, ``db_name``, ``db_user``,
+        ``db_password``, ``db_host``, ``db_port``, ``db_charset``, ``odbc_driver``,
+        ``config_file`` and ``oracle_driver_mode`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
+        | Connect To Database | psycopg2 | my_db | user | pass | tiger.foobar.com | 5432 |
+        | Connect To Database | psycopg2 | my_db | user | pass | tiger.foobar.com | 5432 | my_custom_param=value |
+        | Connect To Database | psycopg2 | my_db | user | pass | tiger.foobar.com | 5432 | alias=my_alias |
+        | Connect To Database | config_file=my_db_params.cfg |
         """
-        config = ConfigReader(dbConfigFile, alias)
-
-        dbapiModuleName = dbapiModuleName or config.get("dbapiModuleName")
-        dbName = dbName or config.get("dbName")
-        dbUsername = dbUsername or config.get("dbUsername")
-        dbPassword = dbPassword if dbPassword is not None else config.get("dbPassword")
-        dbHost = dbHost or config.get("dbHost") or "localhost"
-        dbPort = int(dbPort if dbPort is not None else config.get("dbPort"))
-
-        if dbapiModuleName == "excel" or dbapiModuleName == "excelrw":
+        config = ConfigReader(config_file, alias)
+
+        def _build_connection_params(custom_params=True, **basic_params):
+            con_params = basic_params.copy()
+            for param_name, param_val in basic_params.items():
+                if param_val is None:
+                    con_params.pop(param_name, None)
+            if custom_params:
+                con_params.update(custom_connection_params)
+                con_params.update(other_config_file_params)
+
+            return con_params
+
+        def _log_all_connection_params(*, connection_object=None, connection_string=None, **connection_params):
+            connection_object = connection_object or db_module
+            msg = f"Connect to DB using : {connection_object}.connect("
+            params_separator = ","
+            if connection_string:
+                msg += f'"{connection_string}"'
+                params_separator = ";"
+            for param_name, param_value in connection_params.items():
+                msg += f", {param_name}="
+                if isinstance(param_value, str):
+                    msg += f"'{param_value}'"
+                else:
+                    msg += f"{param_value}"
+            if db_password:
+                msg = msg.replace(f"'{db_password}'", "***")
+            msg = self._hide_password_values(msg, params_separator)
+            msg = msg.replace("connect(, ", "connect(")
+            msg += ")"
+            logger.info(msg)
+
+        def _arg_or_config(arg_value, param_name, *, old_param_name=None, mandatory=False):
+            val_from_config = config.pop(param_name)
+
+            # support deprecated old param names
+            if val_from_config is None and old_param_name is not None:
+                val_from_config = config.pop(old_param_name)
+                if val_from_config is not None:
+                    logger.warn(f"Config file: argument '{old_param_name}' is deprecated, use '{param_name}' instead")
+
+            if arg_value is not None:
+                final_value = arg_value
+                if val_from_config is not None:
+                    logger.info(
+                        f"Parameter '{param_name}' set both as keyword argument and in config file, "
+                        "but keyword arguments take precedence"
+                    )
+            else:
+                final_value = val_from_config
+                if final_value is None and mandatory:
+                    raise ValueError(
+                        f"Required parameter '{param_name}' was not provided - "
+                        "neither in keyword arguments nor in config file"
+                    )
+            return final_value
+
+        # mandatory parameter
+        db_module = _arg_or_config(db_module, "db_module", mandatory=True, old_param_name="dbapiModuleName")
+        # optional named params - named because of custom module specific handling
+        db_name = _arg_or_config(db_name, "db_name", old_param_name="dbName")
+        db_user = _arg_or_config(db_user, "db_user", old_param_name="dbUsername")
+        db_password = _arg_or_config(db_password, "db_password", old_param_name="dbPassword")
+        db_host = _arg_or_config(db_host, "db_host", old_param_name="dbHost")
+        db_port = _arg_or_config(db_port, "db_port", old_param_name="dbPort")
+        if db_port is not None:
+            db_port = int(db_port)
+        db_charset = _arg_or_config(db_charset, "db_charset", old_param_name="dbCharset")
+        odbc_driver = _arg_or_config(odbc_driver, "odbc_driver", old_param_name="dbDriver")
+        oracle_driver_mode = _arg_or_config(oracle_driver_mode, "oracle_driver_mode", old_param_name="driverMode")
+
+        for param_name, param_value in custom_connection_params.items():
+            _arg_or_config(param_value, param_name)
+        other_config_file_params = config.get_all_available_params()
+        if other_config_file_params:
+            logger.info(f"Other params from configuration file: {list(other_config_file_params.keys())}")
+
+        if db_module == "excel" or db_module == "excelrw":
             db_api_module_name = "pyodbc"
-            db_api_2 = importlib.import_module("pyodbc")
         else:
-            db_api_module_name = dbapiModuleName
-            db_api_2 = importlib.import_module(dbapiModuleName)
-
-        if dbapiModuleName in ["MySQLdb", "pymysql"]:
-            dbPort = dbPort or 3306
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"db={dbName}, user={dbUsername}, passwd=***, host={dbHost}, port={dbPort}, charset={dbCharset})"
+            db_api_module_name = db_module
+        db_api_2 = importlib.import_module(db_api_module_name)
+
+        if db_module in ["MySQLdb", "pymysql"]:
+            db_port = db_port or 3306
+            db_charset = db_charset or "utf8mb4"
+            con_params = _build_connection_params(
+                db=db_name, user=db_user, passwd=db_password, host=db_host, port=db_port, charset=db_charset
             )
-            db_connection = db_api_2.connect(
-                db=dbName,
-                user=dbUsername,
-                passwd=dbPassword,
-                host=dbHost,
-                port=dbPort,
-                charset="utf8mb4" or dbCharset,
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
+
+        elif db_module in ["pymssql"]:
+            db_port = db_port or 1433
+            db_charset = db_charset or "UTF-8"
+            con_params = _build_connection_params(
+                database=db_name, user=db_user, password=db_password, host=db_host, port=db_port, charset=db_charset
             )
-        elif dbapiModuleName in ["psycopg2"]:
-            dbPort = dbPort or 5432
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"database={dbName}, user={dbUsername}, password=***, host={dbHost}, port={dbPort})"
-            )
-            db_connection = db_api_2.connect(
-                database=dbName,
-                user=dbUsername,
-                password=dbPassword,
-                host=dbHost,
-                port=dbPort,
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
+
+        elif db_module in ["psycopg2"]:
+            db_port = db_port or 5432
+            con_params = _build_connection_params(
+                database=db_name, user=db_user, password=db_password, host=db_host, port=db_port
             )
-        elif dbapiModuleName in ["pyodbc", "pypyodbc"]:
-            dbPort = dbPort or 1433
-            dbCharset = dbCharset or "utf8mb4"
-            dbDriver = dbDriver or "{SQL Server}"
-            con_str = f"DRIVER={dbDriver};DATABASE={dbName};UID={dbUsername};PWD={dbPassword};charset={dbCharset};"
-            if "mysql" in dbDriver.lower():
-                con_str += f"SERVER={dbHost}:{dbPort}"
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
+
+        elif db_module in ["pyodbc", "pypyodbc"]:
+            db_port = db_port or 1433
+            db_charset = db_charset or "utf8mb4"
+
+            if odbc_driver:
+                con_str = f"DRIVER={odbc_driver};"
             else:
-                con_str += f"SERVER={dbHost},{dbPort}"
-            logger.info(f'Connecting using : {dbapiModuleName}.connect({con_str.replace(dbPassword, "***")})')
+                con_str = ""
+                logger.info("No ODBC driver specified")
+                logger.info(f"List of installed ODBC drivers: {db_api_2.drivers()}")
+            if db_name:
+                con_str += f"DATABASE={db_name};"
+            if db_user:
+                con_str += f"UID={db_user};"
+            if db_password:
+                con_str += f"PWD={db_password};"
+            if db_charset:
+                con_str += f"charset={db_charset};"
+            if db_host and db_port:
+                if odbc_driver and "mysql" in odbc_driver.lower():
+                    con_str += f"SERVER={db_host}:{db_port};"
+                else:
+                    con_str += f"SERVER={db_host},{db_port};"
+
+            for param_name, param_value in custom_connection_params.items():
+                con_str += f"{param_name}={param_value};"
+
+            for param_name, param_value in other_config_file_params.items():
+                con_str += f"{param_name}={param_value};"
+
+            _log_all_connection_params(connection_string=con_str)
             db_connection = db_api_2.connect(con_str)
-        elif dbapiModuleName in ["excel"]:
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"DRIVER={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={dbName};"
-                f'ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)'
-            )
-            db_connection = db_api_2.connect(
-                f"DRIVER={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={dbName};"
-                f'ReadOnly=1;Extended Properties="Excel 8.0;HDR=YES";)',
-                autocommit=True,
-            )
-        elif dbapiModuleName in ["excelrw"]:
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"DRIVER={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={dbName};"
-                f'ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)',
-            )
-            db_connection = db_api_2.connect(
-                f"DRIVER={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={dbName};"
-                f'ReadOnly=0;Extended Properties="Excel 8.0;HDR=YES";)',
-                autocommit=True,
-            )
-        elif dbapiModuleName in ["ibm_db", "ibm_db_dbi"]:
-            dbPort = dbPort or 50000
-            conn_str = f"DATABASE={dbName};HOSTNAME={dbHost};PORT={dbPort};PROTOCOL=TCPIP;UID={dbUsername};"
-            logger.info(f"Connecting using : {dbapiModuleName}.connect(" f"{conn_str};PWD=***;)")
-            db_connection = db_api_2.connect(
-                f"{conn_str};PWD={dbPassword};",
-                "",
-                "",
-            )
-        elif dbapiModuleName in ["cx_Oracle"]:
-            dbPort = dbPort or 1521
-            oracle_dsn = db_api_2.makedsn(host=dbHost, port=dbPort, service_name=dbName)
-            logger.info(
-                f"Connecting using: {dbapiModuleName}.connect(user={dbUsername}, password=***, dsn={oracle_dsn})"
-            )
-            db_connection = db_api_2.connect(user=dbUsername, password=dbPassword, dsn=oracle_dsn)
+
+        elif db_module in ["excel", "excelrw"]:
+            con_str = f"DRIVER={{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}};DBQ={db_name};"
+            con_str += "ReadOnly="
+            if db_module == "excel":
+                con_str += "1;"
+            elif db_module == "excelrw":
+                con_str += "0;"
+            con_str += 'Extended Properties="Excel 8.0;HDR=YES";)'
+            logger.info(f"Connecting using : {db_api_module_name}.connect({con_str}, autocommit=True)")
+            db_connection = db_api_2.connect(con_str, autocommit=True)
+
+        elif db_module in ["ibm_db", "ibm_db_dbi"]:
+            db_port = db_port or 50000
+            con_str = ""
+            if db_name:
+                con_str += f"DATABASE={db_name};"
+            if db_user:
+                con_str += f"UID={db_user};"
+            if db_password:
+                con_str += f"PWD={db_password};"
+            if db_host:
+                con_str += f"HOSTNAME={db_host};"
+            if db_port:
+                con_str += f"PORT={db_port};"
+
+            for param_name, param_value in custom_connection_params.items():
+                con_str += f"{param_name}={param_value};"
+
+            for param_name, param_value in other_config_file_params.items():
+                con_str += f"{param_name}={param_value};"
+
+            con_params = _build_connection_params(custom_params=False, user="", password="")
+            _log_all_connection_params(connection_string=con_str, **con_params)
+            db_connection = db_api_2.connect(con_str, **con_params)
+
+        elif db_module in ["cx_Oracle"]:
+            db_port = db_port or 1521
+            oracle_dsn = db_api_2.makedsn(host=db_host, port=db_port, service_name=db_name)
+            con_params = _build_connection_params(user=db_user, password=db_password, dsn=oracle_dsn)
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
             self.omit_trailing_semicolon = True
-        elif dbapiModuleName in ["oracledb"]:
-            dbPort = dbPort or 1521
-            driverMode = driverMode or "thin"
-            oracle_connection_params = db_api_2.ConnectParams(host=dbHost, port=dbPort, service_name=dbName)
-            if "thick" in driverMode.lower():
+
+        elif db_module in ["oracledb"]:
+            db_port = db_port or 1521
+            oracle_driver_mode = oracle_driver_mode or "thin"
+            oracle_connection_params = db_api_2.ConnectParams(host=db_host, port=db_port, service_name=db_name)
+            if "thick" in oracle_driver_mode.lower():
                 logger.info("Using thick Oracle client mode")
-                mode_param = driverMode.lower().split(",lib_dir=")
+                mode_param = oracle_driver_mode.lower().split(",lib_dir=")
                 if len(mode_param) == 2 and mode_param[0].lower() == "thick":
                     lib_dir = mode_param[1]
                     logger.info(f"Oracle client lib dir specified: {lib_dir}")
@@ -287,121 +435,125 @@ def connect_to_database(
                     logger.info("No Oracle client lib dir specified, oracledb will search it in usual places")
                     db_api_2.init_oracle_client()
                 oracle_thin_mode = False
-            elif "thin" in driverMode.lower():
+            elif "thin" in oracle_driver_mode.lower():
                 oracle_thin_mode = True
                 logger.info("Using thin Oracle client mode")
             else:
-                raise ValueError(f"Invalid Oracle client mode provided: {driverMode}")
-            logger.info(
-                f"Connecting using: {dbapiModuleName}.connect("
-                f"user={dbUsername}, password=***, params={oracle_connection_params})"
-            )
-            db_connection = db_api_2.connect(user=dbUsername, password=dbPassword, params=oracle_connection_params)
+                raise ValueError(f"Invalid Oracle client mode provided: {oracle_driver_mode}")
+            con_params = _build_connection_params(user=db_user, password=db_password, params=oracle_connection_params)
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
             assert db_connection.thin == oracle_thin_mode, (
                 "Expected oracledb to run in thin mode: {oracle_thin_mode}, "
                 f"but the connection has thin mode: {db_connection.thin}"
             )
             self.omit_trailing_semicolon = True
-        elif dbapiModuleName in ["teradata"]:
-            dbPort = dbPort or 1025
+
+        elif db_module in ["teradata"]:
+            db_port = db_port or 1025
             teradata_udaExec = db_api_2.UdaExec(appName="RobotFramework", version="1.0", logConsole=False)
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"database={dbName}, user={dbUsername}, password=***, host={dbHost}, port={dbPort})"
-            )
-            db_connection = teradata_udaExec.connect(
+            con_params = _build_connection_params(
                 method="odbc",
-                system=dbHost,
-                database=dbName,
-                username=dbUsername,
-                password=dbPassword,
-                host=dbHost,
-                port=dbPort,
-            )
-        elif dbapiModuleName in ["ksycopg2"]:
-            dbPort = dbPort or 54321
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"database={dbName}, user={dbUsername}, password=***, host={dbHost}, port={dbPort})"
+                system=db_host,
+                database=db_name,
+                username=db_user,
+                password=db_password,
+                host=db_host,
+                port=db_port,
             )
-            db_connection = db_api_2.connect(
-                database=dbName,
-                user=dbUsername,
-                password=dbPassword,
-                host=dbHost,
-                port=dbPort,
+            _log_all_connection_params(connection_object=f"{db_module}.UdaExec", **con_params)
+            db_connection = teradata_udaExec.connect(**con_params)
+
+        elif db_module in ["ksycopg2"]:
+            db_port = db_port or 54321
+            con_params = _build_connection_params(
+                database=db_name, user=db_user, password=db_password, host=db_host, port=db_port
             )
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
+
         else:
-            logger.info(
-                f"Connecting using : {dbapiModuleName}.connect("
-                f"database={dbName}, user={dbUsername}, password=***, host={dbHost}, port={dbPort}) "
-            )
-            db_connection = db_api_2.connect(
-                database=dbName,
-                user=dbUsername,
-                password=dbPassword,
-                host=dbHost,
-                port=dbPort,
+            con_params = _build_connection_params(
+                database=db_name, user=db_user, password=db_password, host=db_host, port=db_port
             )
+            _log_all_connection_params(**con_params)
+            db_connection = db_api_2.connect(**con_params)
+
         self.connection_store.register_connection(db_connection, db_api_module_name, alias)
 
+    @renamed_args(mapping={"dbapiModuleName": "db_module"})
     def connect_to_database_using_custom_params(
-        self, dbapiModuleName: Optional[str] = None, db_connect_string: str = "", alias: str = "default"
+        self,
+        db_module: Optional[str] = None,
+        db_connect_string: str = "",
+        alias: str = "default",
+        *,
+        dbapiModuleName: Optional[str] = None,
     ):
         """
-        Loads the DB API 2.0 module given `dbapiModuleName` then uses it to
-        connect to the database using the map string `db_connect_string`
+        *DEPRECATED* Use new `Connect To Database` keyword with custom parameters instead.
+        The deprecated keyword will be removed in future versions.
+
+        Loads the DB API 2.0 module given ``db_module`` then uses it to
+        connect to the database using the map string ``db_connect_string``
         (parsed as a list of named arguments).
 
         Use `connect_to_database_using_custom_connection_string` for passing
         all params in a single connection string or URI.
 
-        Example usage:
+        === Some parameters were renamed in version 2.0 ===
+        The old parameter ``dbapiModuleName`` is *deprecated*,
+        please use new parameter ``db_module`` instead.
+
+        *The old parameter will be removed in future versions.*
+
+        === Examples ===
         | Connect To Database Using Custom Params | psycopg2 | database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432 |
         | Connect To Database Using Custom Params | jaydebeapi | 'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t' |
         | Connect To Database Using Custom Params | oracledb | user="username", password="pass", dsn="localhost/orclpdb" |
         | Connect To Database Using Custom Params | sqlite3 | database="./my_database.db", isolation_level=None |
         """
-        db_api_2 = importlib.import_module(dbapiModuleName)
-        db_api_module_name = dbapiModuleName
-
+        db_api_2 = importlib.import_module(db_module)
+        db_api_module_name = db_module
         db_connect_string = f"db_api_2.connect({db_connect_string})"
-
-        connection_string_with_hidden_pass = db_connect_string
-        for pass_param_name in ["pass", "passwd", "password", "pwd", "PWD"]:
-            splitted = connection_string_with_hidden_pass.split(pass_param_name + "=")
-            if len(splitted) < 2:
-                continue
-            splitted = splitted[1].split(",")
-            value_to_hide = splitted[0]
-            connection_string_with_hidden_pass = connection_string_with_hidden_pass.replace(value_to_hide, "***")
         logger.info(
-            f"Executing : Connect To Database Using Custom Params : {dbapiModuleName}.connect("
-            f"{connection_string_with_hidden_pass})"
+            f"Executing : Connect To Database Using Custom Params : {db_module}.connect("
+            f"{self._hide_password_values(db_connect_string)})"
         )
 
         db_connection = eval(db_connect_string)
         self.connection_store.register_connection(db_connection, db_api_module_name, alias)
 
+    @renamed_args(mapping={"dbapiModuleName": "db_module"})
     def connect_to_database_using_custom_connection_string(
-        self, dbapiModuleName: Optional[str] = None, db_connect_string: str = "", alias: str = "default"
+        self,
+        db_module: Optional[str] = None,
+        db_connect_string: str = "",
+        alias: str = "default",
+        *,
+        dbapiModuleName: Optional[str] = None,
     ):
         """
-        Loads the DB API 2.0 module given `dbapiModuleName` then uses it to
-        connect to the database using the `db_connect_string`
+        Loads the DB API 2.0 module given ``db_module`` then uses it to
+        connect to the database using the ``db_connect_string``
         (parsed as single connection string or URI).
 
-        Use `connect_to_database_using_custom_params` for passing
-        connection params as named arguments.
+        Use `Connect To Database` for passing custom connection params as named arguments.
+
+        === Some parameters were renamed in version 2.0 ===
+        The old parameter ``dbapiModuleName`` is *deprecated*,
+        please use new parameter ``db_module`` instead.
+
+        *The old parameter will be removed in future versions.*
 
         Example usage:
         | Connect To Database Using Custom Connection String | psycopg2 | postgresql://postgres:s3cr3t@tiger.foobar.com:5432/my_db_test |
         | Connect To Database Using Custom Connection String | oracledb | username/pass@localhost:1521/orclpdb |
         """
-        db_api_2 = importlib.import_module(dbapiModuleName)
-        db_api_module_name = dbapiModuleName
+        db_api_2 = importlib.import_module(db_module)
+        db_api_module_name = db_module
         logger.info(
-            f"Executing : Connect To Database Using Custom Connection String : {dbapiModuleName}.connect("
+            f"Executing : Connect To Database Using Custom Connection String : {db_module}.connect("
             f"'{db_connect_string}')"
         )
         db_connection = db_api_2.connect(db_connect_string)
@@ -413,13 +565,14 @@ def disconnect_from_database(self, error_if_no_connection: bool = False, alias:
 
         By default, it's not an error if there was no open database connection -
         suitable for usage as a teardown.
-        However, you can enforce it using the `error_if_no_connection` parameter.
+        However, you can enforce it using the ``error_if_no_connection`` parameter.
 
-        Example usage:
-        | Disconnect From Database | # disconnects from current connection to the database |
-        | Disconnect From Database | alias=my_alias | # disconnects from current connection to the database |
+        Use ``alias`` to specify what connection should be closed if `Handling multiple database connections`.
+
+        === Examples ===
+        | Disconnect From Database |
+        | Disconnect From Database | alias=postgres |
         """
-        logger.info("Executing : Disconnect From Database")
         db_connection = self.connection_store.pop_connection(alias)
         if db_connection is None:
             log_msg = "No open database connection to close"
@@ -433,35 +586,34 @@ def disconnect_from_all_databases(self):
         """
         Disconnects from all the databases -
         useful when testing with multiple database connections (aliases).
-
-        For example:
-        | Disconnect From All Databases | # Closes connections to all databases |
         """
-        logger.info("Executing : Disconnect From All Databases")
         for db_connection in self.connection_store:
             db_connection.client.close()
         self.connection_store.clear()
 
-    def set_auto_commit(self, autoCommit: bool = True, alias: Optional[str] = None):
+    @renamed_args(mapping={"autoCommit": "auto_commit"})
+    def set_auto_commit(
+        self, auto_commit: bool = True, alias: Optional[str] = None, *, autoCommit: Optional[bool] = None
+    ):
         """
-        Turn the autocommit on the database connection ON or OFF.
+        Explicitly sets the autocommit behavior of the database connection to ``auto_commit``.
+        See `Commit behavior` for details.
 
-        The default behaviour on a newly created database connection is to automatically start a
-        transaction, which means that database actions that won't work if there is an active
-        transaction will fail. Common examples of these actions are creating or deleting a database
-        or database snapshot. By turning on auto commit on the database connection these actions
-        can be performed.
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        Example usage:
-        | # Default behaviour, sets auto commit to true
+        === Some parameters were renamed in version 2.0 ===
+        The old parameter ``autoCommit`` is *deprecated*,
+        please use new parameter ``auto_commit`` instead.
+
+        *The old parameter will be removed in future versions.*
+
+        === Examples ===
         | Set Auto Commit
-        | Set Auto Commit | alias=my_alias |
-        | # Explicitly set the desired state
-        | Set Auto Commit | False
+        | Set Auto Commit | False |
+        | Set Auto Commit | True  | alias=postgres |
         """
-        logger.info("Executing : Set Auto Commit")
         db_connection = self.connection_store.get_connection(alias)
-        db_connection.client.autocommit = autoCommit
+        db_connection.client.autocommit = auto_commit
 
     def switch_database(self, alias: str):
         """
diff --git a/src/DatabaseLibrary/params_decorator.py b/src/DatabaseLibrary/params_decorator.py
new file mode 100644
index 0000000..b122b3f
--- /dev/null
+++ b/src/DatabaseLibrary/params_decorator.py
@@ -0,0 +1,33 @@
+"""
+These decorators are introduced for the transition from old argument naming / positioning to the new one.
+"""
+from functools import wraps
+
+from robot.api import logger
+
+
+def renamed_args(mapping):
+    """
+    Decorator to rename arguments and warn users about deprecated argument names.
+
+    :param mapping: Dictionary mapping old argument names to new argument names.
+    :return: The decorated function with remapped arguments.
+    """
+
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            # Check if any old argument names are used
+            for old_name, new_name in mapping.items():
+                if old_name in kwargs:
+                    # Issue a warning to the user
+                    logger.warn(f"Argument '{old_name}' is deprecated, use '{new_name}' instead")
+                    # Move the argument value to the new name
+                    logger.info(f"Replacing '{old_name}' with '{new_name}'")
+                    kwargs[new_name] = kwargs.pop(old_name)
+            # Call the original function with updated kwargs
+            return func(*args, **kwargs)
+
+        return wrapper
+
+    return decorator
diff --git a/src/DatabaseLibrary/query.py b/src/DatabaseLibrary/query.py
index 8b40a07..29dd202 100644
--- a/src/DatabaseLibrary/query.py
+++ b/src/DatabaseLibrary/query.py
@@ -12,6 +12,7 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
+import importlib
 import inspect
 import re
 import sys
@@ -19,274 +20,269 @@
 
 from robot.api import logger
 
+from .params_decorator import renamed_args
+
 
 class Query:
     """
     Query handles all the querying done by the Database Library.
     """
 
+    def __init__(self, log_query_results, log_query_results_head):
+        self.LOG_QUERY_RESULTS = log_query_results
+        self.LOG_QUERY_RESULTS_HEAD = log_query_results_head
+
+    @renamed_args(
+        mapping={"selectStatement": "select_statement", "sansTran": "no_transaction", "returnAsDict": "return_dict"}
+    )
     def query(
         self,
-        selectStatement: str,
-        sansTran: bool = False,
-        returnAsDict: bool = False,
+        select_statement: str,
+        no_transaction: bool = False,
+        return_dict: bool = False,
         alias: Optional[str] = None,
         parameters: Optional[Tuple] = None,
+        *,
+        selectStatement: Optional[str] = None,
+        sansTran: Optional[bool] = None,
+        returnAsDict: Optional[bool] = None,
     ):
         """
-        Runs a query with the ``selectStatement`` and returns the result as a list of rows.
+        Runs a query with the ``select_statement`` and returns the result as list of rows.
         The type of row values depends on the database module -
         usually they are tuples or tuple-like objects.
 
-        Set optional input ``returnAsDict`` to _True_ to explicitely convert the return values
-        into a list of dictionaries.
+        Set ``no_transaction`` to _True_ to run command without explicit transaction rollback in case of error.
+        See `Commit behavior` for details.
 
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
-
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
-        depending on the database client):
-        | @{parameters} | Create List |  person |
-        | Query | SELECT * FROM %s | parameters=${parameters} |
+        Set ``return_dict`` to _True_ to explicitly convert the return values into list of dictionaries.
 
-        Use optional ``sansTran`` to run command without an explicit transaction commit or rollback:
-        | @{queryResults} | Query | SELECT * FROM person | True |
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        Tip: Unless you want to log all column values of the specified rows,
-        try specifying the column names in your select statements
-        as much as possible to prevent any unnecessary surprises with schema
-        changes and to easily see what your [] indexing is trying to retrieve
-        (i.e. instead of `"select * from my_table"`, try
-        `"select id, col_1, col_2 from my_table"`).
-
-        For example, given we have a table `person` with the following data:
-        | id | first_name  | last_name |
-        |  1 | Franz Allan | See       |
-
-        When you do the following:
-        | @{queryResults} | Query | SELECT * FROM person |
-        | @{queryResults} | Query | SELECT * FROM person | alias=my_alias |
-        | Log Many | @{queryResults} |
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
+        depending on the database client).
 
-        You will get the following:
-        [1, 'Franz Allan', 'See']
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``selectStatement``, ``sansTran`` and ``returnAsDict`` are *deprecated*,
+        please use new parameters ``select_statement``, ``no_transaction`` and ``return_dict`` instead.
 
-        Also, you can do something like this:
-        | ${queryResults} | Query | SELECT first_name, last_name FROM person |
-        | Log | ${queryResults[0][1]}, ${queryResults[0][0]} |
+        *The old parameters will be removed in future versions.*
 
-        And get the following
-        See, Franz Allan
+        === Examples ===
+        | ${Results}=    | Query | select LAST_NAME from person |
+        | ${Results}=    | Query | select LAST_NAME from person | no_transaction=True |
+        | ${Results}=    | Query | select LAST_NAME from person | return_dict=True |
+        | ${Results}=    | Query | select LAST_NAME from person | alias=postgres |
+        | @{parameters} | Create List |  person |
+        | ${Results}=   | Query | SELECT * FROM %s | parameters=${parameters} |
         """
         db_connection = self.connection_store.get_connection(alias)
         cur = None
         try:
             cur = db_connection.client.cursor()
-            logger.info(f"Executing : Query  |  {selectStatement} ")
-            self.__execute_sql(cur, selectStatement, parameters=parameters)
+            self._execute_sql(cur, select_statement, parameters=parameters)
             all_rows = cur.fetchall()
-            if returnAsDict:
-                col_names = [c[0] for c in cur.description]
+            col_names = [c[0] for c in cur.description]
+            self._log_query_results(col_names, all_rows)
+            if return_dict:
                 return [dict(zip(col_names, row)) for row in all_rows]
             return all_rows
         finally:
-            if cur and not sansTran:
+            if cur and not no_transaction:
                 db_connection.client.rollback()
 
+    @renamed_args(mapping={"selectStatement": "select_statement", "sansTran": "no_transaction"})
     def row_count(
         self,
-        selectStatement: str,
-        sansTran: bool = False,
+        select_statement: str,
+        no_transaction: bool = False,
         alias: Optional[str] = None,
         parameters: Optional[Tuple] = None,
+        *,
+        selectStatement: Optional[str] = None,
+        sansTran: Optional[bool] = None,
     ):
         """
-        Uses the input ``selectStatement`` to query the database and returns the number of rows from the query.
+        Runs a query with the ``select_statement`` and returns the number of rows in the result.
 
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
+        Set ``no_transaction`` to _True_ to run command without explicit transaction rollback in case of error.
+        See `Commit behavior` for details.
 
-        Use optional ``sansTran`` to run command without an explicit transaction commit or rollback:
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
-        depending on the database client):
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
+        depending on the database client).
 
-        Examples:
-        | ${rowCount} | Row Count | SELECT * FROM person |
-        | ${rowCount} | Row Count | SELECT * FROM person | sansTran=True |
-        | ${rowCount} | Row Count | SELECT * FROM person | alias=my_alias |
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``selectStatement`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``select_statement`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
+        | ${Rows}=    | Row Count | select LAST_NAME from person |
+        | ${Rows}=    | Row Count | select LAST_NAME from person | no_transaction=True |
+        | ${Rows}=    | Row Count | select LAST_NAME from person | alias=postgres |
         | @{parameters} | Create List |  person |
-        | ${rowCount} | Row Count | SELECT * FROM %s | parameters=${parameters} |
+        | ${Rows}=   | Row Count | SELECT * FROM %s | parameters=${parameters} |
         """
         db_connection = self.connection_store.get_connection(alias)
         cur = None
         try:
             cur = db_connection.client.cursor()
-            logger.info(f"Executing : Row Count  |  {selectStatement}")
-            self.__execute_sql(cur, selectStatement, parameters=parameters)
+            self._execute_sql(cur, select_statement, parameters=parameters)
             data = cur.fetchall()
+            col_names = [c[0] for c in cur.description]
             if db_connection.module_name in ["sqlite3", "ibm_db", "ibm_db_dbi", "pyodbc"]:
-                return len(data)
-            return cur.rowcount
+                current_row_count = len(data)
+            else:
+                current_row_count = cur.rowcount
+            logger.info(f"Retrieved {current_row_count} rows")
+            self._log_query_results(col_names, data)
+            return current_row_count
         finally:
-            if cur and not sansTran:
+            if cur and not no_transaction:
                 db_connection.client.rollback()
 
+    @renamed_args(mapping={"selectStatement": "select_statement", "sansTran": "no_transaction"})
     def description(
         self,
-        selectStatement: str,
-        sansTran: bool = False,
+        select_statement: str,
+        no_transaction: bool = False,
         alias: Optional[str] = None,
         parameters: Optional[Tuple] = None,
+        *,
+        selectStatement: Optional[str] = None,
+        sansTran: Optional[bool] = None,
     ):
         """
-        Uses the input ``selectStatement`` to query a table in the db which will be used to determine the description.
+        Runs a query with the ``select_statement`` to determine the table description.
 
-        For example, given we have a table `person` with the following data:
-        | id | first_name  | last_name |
-        |  1 | Franz Allan | See       |
+        Set ``no_transaction`` to _True_ to run command without explicit transaction rollback in case of error.
+        See `Commit behavior` for details.
 
-        When you do the following:
-        | @{queryResults} | Description | SELECT * FROM person |
-        | @{queryResults} | Description | SELECT * FROM person | alias=my_alias |
-        | Log Many | @{queryResults} |
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        You will get the following:
-        [Column(name='id', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)]
-        [Column(name='first_name', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)]
-        [Column(name='last_name', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)]
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
+        depending on the database client).
 
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``selectStatement`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``select_statement`` and ``no_transaction`` instead.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
-        depending on the database client):
-        | @{parameters} | Create List |  person |
-        | ${desc} | Description | SELECT * FROM %s | parameters=${parameters} |
+        *The old parameters will be removed in future versions.*
 
-        Using optional `sansTran` to run command without an explicit transaction commit or rollback:
-        | @{queryResults} | Description | SELECT * FROM person | True |
+        === Examples ===
+        | ${Person table description}=  | Description | select LAST_NAME from person |
+        | ${Person table description}=  | Description | select LAST_NAME from person | no_transaction=True |
+        | ${Person table description}=  | Description | select LAST_NAME from person | alias=postgres |
+        | @{parameters} | Create List |  person |
+        | ${Person table description}=   | Description | SELECT * FROM %s | parameters=${parameters} |
         """
         db_connection = self.connection_store.get_connection(alias)
         cur = None
         try:
             cur = db_connection.client.cursor()
-            logger.info("Executing : Description  |  {selectStatement}")
-            self.__execute_sql(cur, selectStatement, parameters=parameters)
+            self._execute_sql(cur, select_statement, parameters=parameters)
             description = list(cur.description)
             if sys.version_info[0] < 3:
                 for row in range(0, len(description)):
                     description[row] = (description[row][0].encode("utf-8"),) + description[row][1:]
             return description
         finally:
-            if cur and not sansTran:
+            if cur and not no_transaction:
                 db_connection.client.rollback()
 
-    def delete_all_rows_from_table(self, tableName: str, sansTran: bool = False, alias: Optional[str] = None):
+    @renamed_args(mapping={"tableName": "table_name", "sansTran": "no_transaction"})
+    def delete_all_rows_from_table(
+        self,
+        table_name: str,
+        no_transaction: bool = False,
+        alias: Optional[str] = None,
+        *,
+        tableName: Optional[str] = None,
+        sansTran: Optional[bool] = None,
+    ):
         """
-        Delete all the rows within a given table.
+        Deletes all rows from table with ``table_name``.
 
-        Use optional `sansTran` to run command without an explicit transaction commit or rollback.
+        Set ``no_transaction`` to _True_ to run command without explicit transaction commit
+        or rollback in case of error.
+        See `Commit behavior` for details.
 
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        Examples:
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``tableName`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``table_name`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
         | Delete All Rows From Table | person |
+        | Delete All Rows From Table | person | no_transaction=True |
         | Delete All Rows From Table | person | alias=my_alias |
-        | Delete All Rows From Table | person | sansTran=True |
         """
         db_connection = self.connection_store.get_connection(alias)
         cur = None
-        query = f"DELETE FROM {tableName}"
+        query = f"DELETE FROM {table_name}"
         try:
             cur = db_connection.client.cursor()
-            logger.info(f"Executing : Delete All Rows From Table  |  {query}")
-            result = self.__execute_sql(cur, query)
+            result = self._execute_sql(cur, query)
             if result is not None:
-                if not sansTran:
+                if not no_transaction:
                     db_connection.client.commit()
                 return result
-            if not sansTran:
+            if not no_transaction:
                 db_connection.client.commit()
         finally:
-            if cur and not sansTran:
+            if cur and not no_transaction:
                 db_connection.client.rollback()
 
+    @renamed_args(mapping={"sqlScriptFileName": "script_path", "sansTran": "no_transaction"})
     def execute_sql_script(
-        self, sqlScriptFileName: str, sansTran: bool = False, alias: Optional[str] = None, split: bool = True
+        self,
+        script_path: str,
+        no_transaction: bool = False,
+        alias: Optional[str] = None,
+        split: bool = True,
+        *,
+        sqlScriptFileName: Optional[str] = None,
+        sansTran: Optional[bool] = None,
     ):
         """
-        Executes the content of the `sqlScriptFileName` as SQL commands. Useful for setting the database to a known
-        state before running your tests, or clearing out your test data after running each a test.
+        Executes the content of the SQL script file loaded from `script_path` as SQL commands.
 
         SQL commands are expected to be delimited by a semicolon (';') - they will be split and executed separately.
-        You can disable this behaviour setting the parameter `split` to _False_ -
-        in this case the entire script content will be passed to the database module for execution.
-
-        Sample usage :
-        | Execute Sql Script | ${EXECDIR}${/}resources${/}DDL-setup.sql |
-        | Execute Sql Script | ${EXECDIR}${/}resources${/}DML-setup.sql |
-        | Execute Sql Script | ${EXECDIR}${/}resources${/}DDL-setup.sql | alias=my_alias |
-        | #interesting stuff here |
-        | Execute Sql Script | ${EXECDIR}${/}resources${/}DML-teardown.sql |
-        | Execute Sql Script | ${EXECDIR}${/}resources${/}DDL-teardown.sql |
-
-
-        For example:
-        DELETE FROM person_employee_table;
-        DELETE FROM person_table;
-        DELETE FROM employee_table;
-
-        Also, the last SQL command can optionally omit its trailing semi-colon.
-
-        For example:
-        DELETE FROM person_employee_table;
-        DELETE FROM person_table;
-        DELETE FROM employee_table
-
-        Given this, that means you can create spread your SQL commands in several
-        lines.
-
-        For example:
-        DELETE
-          FROM person_employee_table;
-        DELETE
-          FROM person_table;
-        DELETE
-          FROM employee_table
-
-        However, lines that starts with a number sign (`#`) or a double dash ("--")
-        are treated as a commented line. Thus, none of the contents of that line will be executed.
-
-
-        For example:
-        # Delete the bridging table first...
-        DELETE
-          FROM person_employee_table;
-          # ...and then the bridged tables.
-        DELETE
-          FROM person_table;
-        DELETE
-          FROM employee_table
-
-        The slash signs ("/") are always ignored and have no impact on execution order.
-
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
-
-        Use optional `sansTran` to run command without an explicit transaction commit or rollback:
-        | Execute Sql Script | ${EXECDIR}${/}resources${/}DDL-setup.sql | True |
+        Set ``split`` to _False_ to disable this behavior  - in this case the entire script content
+        will be passed to the database module for execution as a single command.
+
+        Set ``no_transaction`` to _True_ to run command without explicit transaction commit
+        or rollback in case of error.
+        See `Commit behavior` for details.
+
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
+
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``sqlScriptFileName`` and ``sansTran`` are *deprecated*,
+        please use new parameters ``script_path`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        === Examples ===
+        | Execute SQL Script | insert_data_in_person_table.sql |
+        | Execute SQL Script | insert_data_in_person_table.sql | no_transaction=True |
+        | Execute SQL Script | insert_data_in_person_table.sql | alias=postgres |
+        | Execute SQL Script | insert_data_in_person_table.sql | split=False |
         """
         db_connection = self.connection_store.get_connection(alias)
-        with open(sqlScriptFileName, encoding="UTF-8") as sql_file:
+        with open(script_path, encoding="UTF-8") as sql_file:
             cur = None
             try:
                 cur = db_connection.client.cursor()
-                logger.info(f"Executing : Execute SQL Script  |  {sqlScriptFileName}")
                 if not split:
                     logger.info("Statements splitting disabled - pass entire script content to the database module")
-                    self.__execute_sql(cur, sql_file.read())
+                    self._execute_sql(cur, sql_file.read())
                 else:
                     logger.info("Splitting script file into statements...")
                     statements_to_execute = []
@@ -349,109 +345,286 @@ def execute_sql_script(
                         statements_to_execute.append(current_statement)
 
                     for statement in statements_to_execute:
-                        logger.info(f"Executing statement from script file: {statement}")
                         line_ends_with_proc_end = re.compile(r"(\s|;)" + proc_end_pattern.pattern + "$")
                         omit_semicolon = not line_ends_with_proc_end.search(statement.lower())
-                        self.__execute_sql(cur, statement, omit_semicolon)
-                if not sansTran:
+                        self._execute_sql(cur, statement, omit_semicolon)
+                if not no_transaction:
                     db_connection.client.commit()
             finally:
-                if cur and not sansTran:
+                if cur and not no_transaction:
                     db_connection.client.rollback()
 
+    @renamed_args(
+        mapping={
+            "sqlString": "sql_string",
+            "sansTran": "no_transaction",
+            "omitTrailingSemicolon": "omit_trailing_semicolon",
+        }
+    )
     def execute_sql_string(
         self,
-        sqlString: str,
-        sansTran: bool = False,
+        sql_string: str,
+        no_transaction: bool = False,
         alias: Optional[str] = None,
         parameters: Optional[Tuple] = None,
+        omit_trailing_semicolon: Optional[bool] = None,
+        *,
+        sqlString: Optional[str] = None,
+        sansTran: Optional[bool] = None,
         omitTrailingSemicolon: Optional[bool] = None,
     ):
         """
-        Executes the ``sqlString`` as a single SQL command.
+        Executes the ``sql_string`` as a single SQL command.
+
+        Set ``no_transaction`` to _True_ to run command without explicit transaction commit
+        or rollback in case of error.
+        See `Commit behavior` for details.
 
-        Use optional ``sansTran`` to run command without an explicit transaction commit or rollback.
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
 
-        Use optional ``omitTrailingSemicolon`` parameter for explicit instruction,
+        Use ``parameters`` for query variable substitution (variable substitution syntax may be different
+        depending on the database client).
+
+        Use ``omit_trailing_semicolon`` for explicit instruction,
         if the trailing semicolon (;) at the SQL string end should be removed or not:
         - Some database modules (e.g. Oracle) throw an exception, if you leave a semicolon at the string end
-        - However, there are exceptional cases, when you need it even for Oracle - e.g. at the end of a PL/SQL block.
-        - If not specified, it's decided based on the current database module in use. For Oracle, the semicolon is removed by default.
+        - However, there are exceptional cases, when you need it even for Oracle - e.g. at the end of a PL/SQL block
+        - If not explicitly specified, it's decided based on the current database module in use. For Oracle, the semicolon is removed by default.
 
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``sqlString``, ``sansTran`` and ``omitTrailingSemicolon`` are *deprecated*,
+        please use new parameters ``sql_string``, ``no_transaction`` and ``omit_trailing_semicolon`` instead.
 
-        Use optional ``parameters`` for query variable substitution (variable substitution syntax may be different
-        depending on the database client).
+        *The old parameters will be removed in future versions.*
 
-        For example:
+        === Examples ===
         | Execute Sql String | DELETE FROM person_employee_table; DELETE FROM person_table |
+        | Execute Sql String | DELETE FROM person_employee_table; DELETE FROM person_table | no_transaction=True |
         | Execute Sql String | DELETE FROM person_employee_table; DELETE FROM person_table | alias=my_alias |
-        | Execute Sql String | DELETE FROM person_employee_table; DELETE FROM person_table | sansTran=True |
-        | Execute Sql String | CREATE PROCEDURE proc AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello!'); END; | omitTrailingSemicolon=False |
+        | Execute Sql String | CREATE PROCEDURE proc AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello!'); END; | omit_trailing_semicolon=False |
         | @{parameters} | Create List |  person_employee_table |
-        | Execute Sql String | SELECT * FROM %s | parameters=${parameters} |
+        | Execute Sql String | DELETE FROM %s | parameters=${parameters} |
         """
         db_connection = self.connection_store.get_connection(alias)
         cur = None
         try:
             cur = db_connection.client.cursor()
-            logger.info(f"Executing : Execute SQL String  |  {sqlString}")
-            self.__execute_sql(cur, sqlString, omit_trailing_semicolon=omitTrailingSemicolon, parameters=parameters)
-            if not sansTran:
+            self._execute_sql(cur, sql_string, omit_trailing_semicolon=omit_trailing_semicolon, parameters=parameters)
+            if not no_transaction:
                 db_connection.client.commit()
         finally:
-            if cur and not sansTran:
+            if cur and not no_transaction:
                 db_connection.client.rollback()
 
+    @renamed_args(mapping={"spName": "procedure_name", "spParams": "procedure_params", "sansTran": "no_transaction"})
     def call_stored_procedure(
-        self, spName: str, spParams: Optional[List[str]] = None, sansTran: bool = False, alias: Optional[str] = None
+        self,
+        procedure_name: str,
+        procedure_params: Optional[List] = None,
+        no_transaction: bool = False,
+        alias: Optional[str] = None,
+        additional_output_params: Optional[List] = None,
+        *,
+        spName: Optional[str] = None,
+        spParams: Optional[List] = None,
+        sansTran: Optional[bool] = None,
     ):
         """
-        Calls a stored procedure `spName` with the `spParams` - a *list* of parameters the procedure requires.
-        Use the special *CURSOR* value for OUT params, which should receive result sets -
+        Calls a stored procedure `procedure_name` with the `procedure_params` - a *list* of parameters the procedure requires.
+        *Returns two lists* - the _parameter values_ and the _result sets_.
+
+        Use the special *CURSOR* value for OUT params, which should receive result sets - relevant only for some databases (e.g. Oracle or PostgreSQL).
+
+        Set ``no_transaction`` to _True_ to run command without explicit transaction commit
+        or rollback in case of error.
+        See `Commit behavior` for details.
+
+        Use ``alias`` to specify what connection should be used if `Handling multiple database connections`.
+
+        Use the ``additional_output_params`` list for OUT params of a procedure in MSSQL.
+
+        === Some parameters were renamed in version 2.0 ===
+        The old parameters ``spName``, ``spParams`` and ``sansTran`` are *deprecated*, please use
+        new parameters ``procedure_name``, ``procedure_params`` and ``no_transaction`` instead.
+
+        *The old parameters will be removed in future versions.*
+
+        = Handling parameters and result sets =
+        Handling the input and output parameters and the result sets is very different
+        depending on the database itself and on the Python database driver - i.e. how it implements the `cursor.callproc()` function.
+
+        == Common case (e.g. MySQL) ==
+        Generally a procedure call requires all parameter values (IN and OUT) put together in a list - `procedure_params`.
+
+        Calling the procedure returns *two lists*:
+        - *Param values* - the copy of procedure parameters (modified, if the procedure changes the OUT params). The list is empty, if procedures receives no params.
+        - *Result sets* - the list of lists, each of them containing results of some query, if the procedure returns them.
+
+        == Oracle (oracledb, cx_Oracle) ==
+        Oracle procedures work fine with simple IN and OUT params, but require some special handling of result sets.
+
+        === Simple case with IN and OUT params (no result sets) ===
+        Consider the following procedure:
+        | CREATE OR REPLACE PROCEDURE
+        | get_second_name (person_first_name IN VARCHAR, person_second_name OUT VARCHAR) AS
+        | BEGIN
+        |   SELECT last_name
+        |   INTO person_second_name
+        |   FROM person
+        |   WHERE first_name = person_first_name;
+        | END;
+
+        Calling the procedure in Robot Framework:
+        | @{params}=         Create List    Jerry    OUTPUT
+        | # Second parameter value can be anything, it will be replaced anyway
+        |
+        | ${param values}    ${result sets}=    Call Stored Procedure    get_second_name    ${params}
+        | # ${param values} = ['Jerry', 'Schneider']
+        | # ${result sets} = []
+
+        === Oracle procedure returning a result set ===
+        If a procedure in Oracle should return a result set, it must take OUT parameters of a special type -
+        _SYS_REFCURSOR_.
+
+        Consider the following procedure:
+        | get_all_second_names (second_names_cursor OUT SYS_REFCURSOR) AS
+        | BEGIN
+        |   OPEN second_names_cursor for
+        |   SELECT LAST_NAME FROM person;
+        | END;
+
+        Calling the procedure in Robot Framework requires the special value *CURSOR* for the OUT parameters,
+        they will be converted to appropriate DB variables before calling the procedure.
+        | @{params}=    Create List    CURSOR
+        | # The parameter must have this special value CURSOR
+        |
+        | ${param values}    ${result sets}=    Call Stored Procedure    get_all_second_names    ${params}
+        | # ${param values} = [<oracledb.Cursor on <oracledb.Connection ...>>]
+        | # ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]
+
+        === Oracle procedure returning multiple result sets ===
+        If a procedure takes multiple OUT parameters of the _SYS_REFCURSOR_ type, they all must have
+        the special *CURSOR* value when calling the procedure:
+        | @{params} =        Create List         CURSOR    CURSOR
+        | ${param values}    ${result sets} =    Call Stored Procedure    Get_all_first_and_second_names    ${params}
+        | # ${param values} = [<oracledb.Cursor on <oracledb.Connection ...>>, <oracledb.Cursor on <oracledb.Connection ...>>]
+        | # ${result sets}  = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]
+
+        == PostgreSQL (psycopg2, psycopg3) ==
+        PostgreSQL doesn't return single values as params, only as result sets.
+        It also supports special handling of result sets over OUT params of a special type (like Oracle).
+
+        === Simple case with IN and OUT params (no CURSOR parameters) ===
+        Consider the following procedure:
+        | CREATE FUNCTION
+        | get_second_name (IN person_first_name VARCHAR(20),
+        | OUT person_second_name VARCHAR(20))
+        | LANGUAGE plpgsql
+        | AS
+        | '
+        | BEGIN
+        |   SELECT LAST_NAME INTO person_second_name
+        |   FROM person
+        |   WHERE FIRST_NAME = person_first_name;
+        | END
+        | ';
+
+        Calling the procedure in Robot Framework:
+        | @{params}=    Create List    Jerry
+        | ${param values}    ${result sets}=    Call Stored Procedure    get_second_name    ${params}
+        | # ${param values} = ['Jerry']
+        | # ${result sets} = [[('Schneider',)]]
+
+        === PostgreSQL procedure with CURSOR parameters ===
+        If a procedure in PostgreSQL should return a proper result set, it must take OUT parameters of a special type -
+        _refcursor_.
+
+        Consider the following procedure:
+        | CREATE FUNCTION
+        | get_all_first_and_second_names(result1 refcursor, result2 refcursor)
+        | RETURNS SETOF refcursor
+        | LANGUAGE plpgsql
+        | AS
+        | '
+        | BEGIN
+        |   OPEN result1 FOR SELECT FIRST_NAME FROM person;
+        |   RETURN NEXT result1;
+        |   OPEN result2 FOR SELECT LAST_NAME FROM person;
+        |   RETURN NEXT result2;
+        | END
+        | ';
+
+        Calling the procedure in Robot Framework requires the special value *CURSOR* for the OUT parameters,
         they will be converted to appropriate DB variables before calling the procedure.
-        This is necessary only for some databases (e.g. Oracle or PostgreSQL).
-
-        The keywords always *returns two lists*:
-        - *Param values* - the copy of procedure parameters (modified, if the procedure changes the OUT params).
-        The list is empty, if procedures receives no params.
-        - *Result sets* - the list of lists, each of them containing results of some query, if the procedure
-        returns them or put them in the OUT params of type *CURSOR* (like in Oracle or PostgreSQL).
-
-        It also depends on the database, how the procedure returns the values - as params or as result sets.
-        E.g. calling a procedure in *PostgreSQL* returns even a single value of an OUT param as a result set.
-
-        Simple example:
-        | @{Params} = | Create List | Jerry | out_second_name |
-        | @{Param values}    @{Result sets} = | Call Stored Procedure | Get_second_name | ${Params} |
-        | # ${Param values} = ['Jerry', 'Schneider'] |
-        | # ${result sets} = [] |
-
-        Example with a single CURSOR parameter (Oracle DB):
-        | @{Params} = | Create List | CURSOR |
-        | @{Param values}    @{Result sets} = | Call Stored Procedure | Get_all_second_names | ${Params} |
-        | # ${Param values} = [<oracledb.Cursor on <oracledb.Connection ...>>] |
-        | # ${result sets} = [[('See',), ('Schneider',)]] |
-
-        Example with multiple CURSOR parameters (Oracle DB):
-        | @{Params} = | Create List | CURSOR | CURSOR |
-        | @{Param values}    @{Result sets} = | Call Stored Procedure | Get_all_first_and_second_names | ${Params} |
-        | # ${Param values} = [<oracledb.Cursor on <oracledb.Connection ...>>, <oracledb.Cursor on <oracledb.Connection ...>>] |
-        | # ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]] |
-
-        Use optional ``alias`` parameter to specify what connection should be used for the query if you have more
-        than one connection open.
-
-        Use optional `sansTran` to run command without an explicit transaction commit or rollback:
-        | @{Param values}    @{Result sets} = | Call Stored Procedure | DBName.SchemaName.StoredProcName | ${Params} | True |
+        | @{params}=    Create List    CURSOR    CURSOR
+        | # The parameters must have this special value CURSOR
+        |
+        | ${param values}    ${result sets}=    Call Stored Procedure    get_all_first_and_second_names    ${params}
+        | # ${param values} = ['CURSOR_0', 'CURSOR_1']
+        | # ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]
+
+        == MS SQL Server (pymssql) ==
+        The _pymssql_ driver doesn't natively support getting the OUT parameter values after calling a procedure.
+        - This requires special handling of OUT parameters using the `additional_output_params` argument.
+        - Furthermore, it's not possible to fetch the OUT parameter values for a procedure, which returns a result set AND has OUT parameters.
+
+        === Simple case with IN and OUT params (no result sets) ===
+        Consider the following procedure:
+        | CREATE PROCEDURE
+        | return_out_param_without_result_sets
+        | @my_input VARCHAR(20),
+        | @my_output INT OUTPUT
+        | AS
+        | BEGIN
+        |  IF @my_input = 'give me 1'
+        |     BEGIN
+        |         SELECT @my_output = 1;
+        |     END
+        |     ELSE
+        |     BEGIN
+        |         SELECT @my_output = 0;
+        |     END
+        | END;
+
+        Calling the procedure in Robot Framework requires putting the IN parameters as usual in the `procedure_params` argument,
+        but the sample values of OUT parameters must be put in the argument `additional_output_params`.
+
+        | @{params}=    Create List    give me 1
+        | @{out_params}=    Create List    ${9}
+        | ${param values}    ${result sets}=    Call Stored Procedure    return_out_param_without_result_sets
+        | ...    ${params}    additional_output_params=${out_params}
+        | # ${result sets} = []
+        | # ${param values} = ('give me 1', 1)
+
+        The library uses the sample values in the `additional_output_params` list to determine the number and the type
+        of OUT parameters - so they are type-sensitive, the type must be the same as in the procedure itself.
+
+        === MS SQL procedure returning a result set (no OUT params) ===
+        If a procedure doesn't have any OUT params and returns only result sets, they are handled in a normal way.
+        Consider the following procedure:
+        | CREATE PROCEDURE get_all_first_and_second_names
+        | AS
+        | BEGIN
+        |   SELECT FIRST_NAME FROM person;
+        |   SELECT LAST_NAME FROM person;
+        |   RETURN;
+        | END;
+
+        Calling the procedure in Robot Framework:
+        | ${param values}    ${result sets}=    Call Stored Procedure    get_all_first_and_second_names
+        | ${param values} = ()
+        | ${result sets} = [[('Franz Allan',), ('Jerry',)], [('See',), ('Schneider',)]]
+
+        === MS SQL procedure returning result sets AND OUT params ===
+        This case is *not fully supported* by the library - the OUT params won't be fetched.
         """
         db_connection = self.connection_store.get_connection(alias)
-        if spParams is None:
-            spParams = []
+        if procedure_params is None:
+            procedure_params = []
+        if additional_output_params is None:
+            additional_output_params = []
         cur = None
         try:
-            logger.info(f"Executing : Call Stored Procedure  |  {spName}  |  {spParams}")
             if db_connection.module_name == "pymssql":
                 cur = db_connection.client.cursor(as_dict=False)
             else:
@@ -461,7 +634,7 @@ def call_stored_procedure(
             result_sets = []
 
             if db_connection.module_name == "pymysql":
-                cur.callproc(spName, spParams)
+                cur.callproc(procedure_name, procedure_params)
 
                 # first proceed the result sets if available
                 result_sets_available = True
@@ -473,36 +646,35 @@ def call_stored_procedure(
                 result_sets.pop()
 
                 # now go on with single values - modified input params
-                for i in range(0, len(spParams)):
-                    cur.execute(f"select @_{spName}_{i}")
+                for i in range(0, len(procedure_params)):
+                    cur.execute(f"select @_{procedure_name}_{i}")
                     param_values.append(cur.fetchall()[0][0])
 
             elif db_connection.module_name in ["oracledb", "cx_Oracle"]:
                 # check if "CURSOR" params were passed - they will be replaced
                 # with cursor variables for storing the result sets
-                params_substituted = spParams.copy()
+                params_substituted = procedure_params.copy()
                 cursor_params = []
-                for i in range(0, len(spParams)):
-                    if spParams[i] == "CURSOR":
+                for i in range(0, len(procedure_params)):
+                    if procedure_params[i] == "CURSOR":
                         cursor_param = db_connection.client.cursor()
                         params_substituted[i] = cursor_param
                         cursor_params.append(cursor_param)
-                param_values = cur.callproc(spName, params_substituted)
+                param_values = cur.callproc(procedure_name, params_substituted)
                 for result_set in cursor_params:
                     result_sets.append(list(result_set))
 
             elif db_connection.module_name in ["psycopg2", "psycopg3"]:
-                cur = db_connection.client.cursor()
                 # check if "CURSOR" params were passed - they will be replaced
                 # with cursor variables for storing the result sets
-                params_substituted = spParams.copy()
+                params_substituted = procedure_params.copy()
                 cursor_params = []
-                for i in range(0, len(spParams)):
-                    if spParams[i] == "CURSOR":
+                for i in range(0, len(procedure_params)):
+                    if procedure_params[i] == "CURSOR":
                         cursor_param = f"CURSOR_{i}"
                         params_substituted[i] = cursor_param
                         cursor_params.append(cursor_param)
-                param_values = cur.callproc(spName, params_substituted)
+                param_values = cur.callproc(procedure_name, params_substituted)
                 if cursor_params:
                     for cursor_param in cursor_params:
                         cur.execute(f'FETCH ALL IN "{cursor_param}"')
@@ -519,13 +691,20 @@ def call_stored_procedure(
                         result_sets.append(list(result_set))
 
             else:
-                logger.info(
-                    f"CAUTION! Calling a stored procedure for '{db_connection.module_name}' is not tested, "
-                    "results might be invalid!"
-                )
-                cur = db_connection.client.cursor()
-                param_values = cur.callproc(spName, spParams)
-                logger.info("Reading the procedure results..")
+                if db_connection.module_name == "pymssql":
+                    mssql = importlib.import_module("pymssql")
+                    procedure_params = procedure_params.copy()
+                    for param in additional_output_params:
+                        procedure_params.append(mssql.output(type(param), param))
+
+                else:
+                    logger.info(
+                        f"Calling a stored procedure for '{db_connection.module_name}'. "
+                        "No special handling is known, so trying the common way with return params and result sets."
+                    )
+
+                param_values = cur.callproc(procedure_name, procedure_params)
+                logger.info("Reading the procedure result sets..")
                 result_sets_available = True
                 while result_sets_available:
                     result_set = []
@@ -538,15 +717,33 @@ def call_stored_procedure(
                     else:
                         result_sets_available = False
 
-            if not sansTran:
+            if not no_transaction:
                 db_connection.client.commit()
 
             return param_values, result_sets
         finally:
-            if cur and not sansTran:
+            if cur and not no_transaction:
                 db_connection.client.rollback()
 
-    def __execute_sql(
+    def set_logging_query_results(self, enabled: Optional[bool] = None, log_head: Optional[int] = None):
+        """
+        Allows to enable/disable logging of query results and to adjust the log head value.
+        - Overrides the values, which were set during the library import.
+        - See `Logging query results` for details.
+
+        Examples:
+        | Set Logging Query Results | enabled=False |
+        | Set Logging Query Results | enabled=True | log_head=0 |
+        | Set Logging Query Results | log_head=10 |
+        """
+        if enabled is not None:
+            self.LOG_QUERY_RESULTS = enabled
+        if log_head is not None:
+            if log_head < 0:
+                raise ValueError(f"Wrong log head value provided: {log_head}. The value can't be negative!")
+            self.LOG_QUERY_RESULTS_HEAD = log_head
+
+    def _execute_sql(
         self,
         cur,
         sql_statement: str,
@@ -565,8 +762,54 @@ def __execute_sql(
         if omit_trailing_semicolon:
             sql_statement = sql_statement.rstrip(";")
         if parameters is None:
-            logger.debug(f"Executing sql '{sql_statement}' without parameters")
+            logger.info(f'Executing sql:<br><code style="font-weight: bold;">{sql_statement}</code>', html=True)
             return cur.execute(sql_statement)
         else:
-            logger.debug(f"Executing sql '{sql_statement}' with parameters: {parameters}")
+            logger.info(
+                f'Executing sql:<br><code style="font-weight: bold;">{sql_statement}</code><br>Parameters: <code style="font-weight: bold;">{parameters}</code>',
+                html=True,
+            )
             return cur.execute(sql_statement, parameters)
+
+    def _log_query_results(self, col_names, result_rows, log_head: Optional[int] = None):
+        """
+        Logs the `result_rows` of a query in RF log as a HTML table.
+        The `col_names` are needed for the table header.
+        Max. `log_head` rows are logged (`0` disables the limit).
+        """
+        if not self.LOG_QUERY_RESULTS:
+            return
+
+        if log_head is None:
+            log_head = self.LOG_QUERY_RESULTS_HEAD
+        cell_border_and_align = "border: 1px solid rgb(160 160 160);padding: 8px 10px;text-align: center;"
+        table_border = "2px solid rgb(140 140 140)"
+        row_index_color = "#d6ecd4"
+        msg = f'<div style="max-width: 100%; overflow-x: auto;">'
+        msg += f'<table style="width: auto; border-collapse: collapse; border: {table_border}">'
+        msg += f'<caption style="text-align: left; font-weight: bold; padding: 5px;">Query returned {len(result_rows)} rows</caption>'
+        msg += "<tr>"
+        msg += f'<th scope="col" style="background-color: {row_index_color}; {cell_border_and_align}">Row</th>'
+        for col in col_names:
+            msg += f'<th scope="col" style="background-color: #505050; color: #fff;{cell_border_and_align}">{col}</th>'
+        msg += "</tr>"
+        table_truncated = False
+        for i, row in enumerate(result_rows):
+            if log_head and i >= log_head:
+                table_truncated = True
+                break
+            row_style = ""
+            if i % 2 == 0:
+                row_style = ' style="background-color: #eee;"'
+            msg += f"<tr{row_style}>"
+            msg += f'<th scope="row" style="background-color: {row_index_color};{cell_border_and_align}">{i}</th>'
+            for cell in row:
+                msg += f'<td style="{cell_border_and_align}">{cell}</td>'
+            msg += "</tr>"
+        msg += "</table>"
+        if table_truncated:
+            msg += (
+                f'<p style="font-weight: bold;">Log limit of {log_head} rows was reached, the table was truncated</p>'
+            )
+        msg += "</div>"
+        logger.info(msg, html=True)
diff --git a/src/DatabaseLibrary/version.py b/src/DatabaseLibrary/version.py
index 8f8e75e..2101409 100644
--- a/src/DatabaseLibrary/version.py
+++ b/src/DatabaseLibrary/version.py
@@ -1,1 +1,1 @@
-VERSION = "1.4.4"
+VERSION = "2.0.0"


Test patch:
diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml
index 1f284dc..b036e63 100644
--- a/.github/workflows/unit_tests.yml
+++ b/.github/workflows/unit_tests.yml
@@ -12,12 +12,9 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - os: 'ubuntu-latest'
-            python-version: '3.7'
-            rf-version: '3.2.2'
           - os: 'ubuntu-latest'
             python-version: '3.8'
-            rf-version: '4.1.3'
+            rf-version: '5.0.1'
           - os: 'ubuntu-latest'
             python-version: '3.9'
             rf-version: '5.0.1'
@@ -29,7 +26,7 @@ jobs:
             rf-version: '6.1.1'
           - os: 'ubuntu-latest'
             python-version: '3.12'
-            rf-version: '7.0a1'
+            rf-version: '7.0.1'
     runs-on: ${{ matrix.os }}
 
     steps:
diff --git a/test/resources/common.resource b/test/resources/common.resource
index 34831bc..487fa10 100644
--- a/test/resources/common.resource
+++ b/test/resources/common.resource
@@ -5,6 +5,8 @@ Documentation       Global variables, which are used in all test common tests
 Library             Collections
 Library             OperatingSystem
 Library             DatabaseLibrary
+Library             DateTime
+Resource            config_files/connect_config_file.resource
 
 
 *** Variables ***
@@ -25,8 +27,10 @@ Connect To DB
     [Documentation]    Connects to the database based on the current DB module under test
     ...    and connection params set in global variables with alias
     [Arguments]    ${alias}=${None}
-    ${DB_KWARGS}    Create Dictionary
-    IF    $alias is not None    Set To Dictionary    ${DB_KWARGS}    alias=${alias}
+    ${DB_KWARGS}=    Create Dictionary
+    IF    $alias is not None
+        Set To Dictionary    ${DB_KWARGS}    alias=${alias}
+    END
     IF    "${DB_MODULE_MODE}" == "custom"
         IF    "${DB_MODULE}" == "sqlite3"
             Remove File    ${DBName}.db
@@ -37,8 +41,16 @@ Connect To DB
             Connect To Database Using Custom Connection String    ${DB_MODULE}    ${Connection String}    &{DB_KWARGS}
         END
     ELSE IF    "${DB_MODULE_MODE}" == "standard"
-        ${DB_ARGS}    Create List    ${DB_MODULE}    ${DB_NAME}    ${DB_USER}    ${DB_PASS}    ${DB_HOST}    ${DB_PORT}
-        IF    "${DB_MODULE}" == "pyodbc"    Set To Dictionary    ${DB_KWARGS}    dbDriver=${DB_DRIVER}
+        ${DB_ARGS}=    Create List
+        ...    ${DB_MODULE}
+        ...    ${DB_NAME}
+        ...    ${DB_USER}
+        ...    ${DB_PASS}
+        ...    ${DB_HOST}
+        ...    ${DB_PORT}
+        IF    "${DB_MODULE}" == "pyodbc"
+            Set To Dictionary    ${DB_KWARGS}    odbc_driver=${DB_DRIVER}
+        END
         Connect To Database    @{DB_ARGS}    &{DB_KWARGS}
     ELSE
         Fail    Unexpected mode - ${DB_MODULE_MODE}
diff --git a/test/resources/config_files/connect_config_file.resource b/test/resources/config_files/connect_config_file.resource
new file mode 100644
index 0000000..621ecd3
--- /dev/null
+++ b/test/resources/config_files/connect_config_file.resource
@@ -0,0 +1,11 @@
+*** Settings ***
+Resource    ../common.resource
+
+
+*** Keywords ***
+Connect Using Config File
+    [Documentation]    `File name` is only name without extension,
+    ...    the path is build relative to the resource directory
+    [Arguments]    ${File name}=${None}    &{Params}
+    ${Path}=    Set Variable    ${CURDIR}/${File name}.cfg
+    Connect To Database    config_file=${Path}    &{Params}
diff --git a/test/resources/config_files/oracledb/custom_param_password.cfg b/test/resources/config_files/oracledb/custom_param_password.cfg
new file mode 100644
index 0000000..d6d93b9
--- /dev/null
+++ b/test/resources/config_files/oracledb/custom_param_password.cfg
@@ -0,0 +1,6 @@
+[default]
+db_module=oracledb
+db_name=db
+password=pass
+db_host=127.0.0.1
+db_port=1521
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/invalid_custom_params.cfg b/test/resources/config_files/oracledb/invalid_custom_params.cfg
new file mode 100644
index 0000000..1214b8b
--- /dev/null
+++ b/test/resources/config_files/oracledb/invalid_custom_params.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=oracledb
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=1521
+blah=blah
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/old_param_names.cfg b/test/resources/config_files/oracledb/old_param_names.cfg
new file mode 100644
index 0000000..2d81cd4
--- /dev/null
+++ b/test/resources/config_files/oracledb/old_param_names.cfg
@@ -0,0 +1,8 @@
+[default]
+dbapiModuleName=oracledb
+dbName=db
+dbUsername=db_user
+dbPassword=pass
+dbHost=127.0.0.1
+dbPort=1521
+driverMode=thin
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/simple_default_alias.cfg b/test/resources/config_files/oracledb/simple_default_alias.cfg
new file mode 100644
index 0000000..fe487e8
--- /dev/null
+++ b/test/resources/config_files/oracledb/simple_default_alias.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=oracledb
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=1521
+oracle_driver_mode=thin
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/some_basic_params_missing.cfg b/test/resources/config_files/oracledb/some_basic_params_missing.cfg
new file mode 100644
index 0000000..7e845af
--- /dev/null
+++ b/test/resources/config_files/oracledb/some_basic_params_missing.cfg
@@ -0,0 +1,3 @@
+[default]
+db_module=oracledb
+db_name=db
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/thick_mode.cfg b/test/resources/config_files/oracledb/thick_mode.cfg
new file mode 100644
index 0000000..bd1a487
--- /dev/null
+++ b/test/resources/config_files/oracledb/thick_mode.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=oracledb
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=1521
+oracle_driver_mode=thick
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/valid_custom_params.cfg b/test/resources/config_files/oracledb/valid_custom_params.cfg
new file mode 100644
index 0000000..df3bffd
--- /dev/null
+++ b/test/resources/config_files/oracledb/valid_custom_params.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=oracledb
+db_name=db
+user=db_user
+password=pass
+db_host=127.0.0.1
+db_port=1521
\ No newline at end of file
diff --git a/test/resources/config_files/oracledb/wrong_password.cfg b/test/resources/config_files/oracledb/wrong_password.cfg
new file mode 100644
index 0000000..87691ac
--- /dev/null
+++ b/test/resources/config_files/oracledb/wrong_password.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=oracledb
+db_name=db
+db_user=db_user
+db_password=wrong
+db_host=127.0.0.1
+db_port=1521
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/custom_param_password.cfg b/test/resources/config_files/psycopg2/custom_param_password.cfg
new file mode 100644
index 0000000..1ae5cb9
--- /dev/null
+++ b/test/resources/config_files/psycopg2/custom_param_password.cfg
@@ -0,0 +1,6 @@
+[default]
+db_module=psycopg2
+db_name=db
+password=pass
+db_host=127.0.0.1
+db_port=5432
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/invalid_custom_params.cfg b/test/resources/config_files/psycopg2/invalid_custom_params.cfg
new file mode 100644
index 0000000..1496965
--- /dev/null
+++ b/test/resources/config_files/psycopg2/invalid_custom_params.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=psycopg2
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=5432
+blah=blah
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/old_param_names.cfg b/test/resources/config_files/psycopg2/old_param_names.cfg
new file mode 100644
index 0000000..d9faef7
--- /dev/null
+++ b/test/resources/config_files/psycopg2/old_param_names.cfg
@@ -0,0 +1,7 @@
+[default]
+dbapiModuleName=psycopg2
+dbName=db
+dbUsername=db_user
+dbPassword=pass
+dbHost=127.0.0.1
+dbPort=5432
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/simple_default_alias.cfg b/test/resources/config_files/psycopg2/simple_default_alias.cfg
new file mode 100644
index 0000000..a80ef74
--- /dev/null
+++ b/test/resources/config_files/psycopg2/simple_default_alias.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=psycopg2
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=5432
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/some_basic_params_missing.cfg b/test/resources/config_files/psycopg2/some_basic_params_missing.cfg
new file mode 100644
index 0000000..49d1cde
--- /dev/null
+++ b/test/resources/config_files/psycopg2/some_basic_params_missing.cfg
@@ -0,0 +1,3 @@
+[default]
+db_module=psycopg2
+db_name=db
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/valid_custom_params.cfg b/test/resources/config_files/psycopg2/valid_custom_params.cfg
new file mode 100644
index 0000000..fb15ffa
--- /dev/null
+++ b/test/resources/config_files/psycopg2/valid_custom_params.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=psycopg2
+db_name=db
+user=db_user
+password=pass
+db_host=127.0.0.1
+db_port=5432
\ No newline at end of file
diff --git a/test/resources/config_files/psycopg2/wrong_password.cfg b/test/resources/config_files/psycopg2/wrong_password.cfg
new file mode 100644
index 0000000..9e97614
--- /dev/null
+++ b/test/resources/config_files/psycopg2/wrong_password.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=psycopg2
+db_name=db
+db_user=db_user
+db_password=wrong
+db_host=127.0.0.1
+db_port=5432
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/charset_invalid.cfg b/test/resources/config_files/pymssql/charset_invalid.cfg
new file mode 100644
index 0000000..dab6951
--- /dev/null
+++ b/test/resources/config_files/pymssql/charset_invalid.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pymssql
+db_name=db
+user=SA
+password=MyPass1234!
+db_host=127.0.0.1
+db_port=1433
+db_charset=wrong
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/custom_param_password.cfg b/test/resources/config_files/pymssql/custom_param_password.cfg
new file mode 100644
index 0000000..ff03d15
--- /dev/null
+++ b/test/resources/config_files/pymssql/custom_param_password.cfg
@@ -0,0 +1,6 @@
+[default]
+db_module=pymssql
+db_name=db
+password=MyPass1234!
+db_host=127.0.0.1
+db_port=1433
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/invalid_custom_params.cfg b/test/resources/config_files/pymssql/invalid_custom_params.cfg
new file mode 100644
index 0000000..1c6c801
--- /dev/null
+++ b/test/resources/config_files/pymssql/invalid_custom_params.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pymssql
+db_name=db
+db_user=SA
+db_password=MyPass1234!
+db_host=127.0.0.1
+db_port=1433
+blah=blah
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/old_param_names.cfg b/test/resources/config_files/pymssql/old_param_names.cfg
new file mode 100644
index 0000000..00a68ad
--- /dev/null
+++ b/test/resources/config_files/pymssql/old_param_names.cfg
@@ -0,0 +1,7 @@
+[default]
+dbapiModuleName=pymssql
+dbName=db
+dbUsername=SA
+dbPassword=MyPass1234!
+dbHost=127.0.0.1
+dbPort=1433
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/simple_default_alias.cfg b/test/resources/config_files/pymssql/simple_default_alias.cfg
new file mode 100644
index 0000000..cd111ab
--- /dev/null
+++ b/test/resources/config_files/pymssql/simple_default_alias.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pymssql
+db_name=db
+db_user=SA
+db_password=MyPass1234!
+db_host=127.0.0.1
+db_port=1433
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/some_basic_params_missing.cfg b/test/resources/config_files/pymssql/some_basic_params_missing.cfg
new file mode 100644
index 0000000..20e4533
--- /dev/null
+++ b/test/resources/config_files/pymssql/some_basic_params_missing.cfg
@@ -0,0 +1,3 @@
+[default]
+db_module=pymssql
+db_name=db
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/valid_custom_params.cfg b/test/resources/config_files/pymssql/valid_custom_params.cfg
new file mode 100644
index 0000000..47613a2
--- /dev/null
+++ b/test/resources/config_files/pymssql/valid_custom_params.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pymssql
+db_name=db
+user=SA
+password=MyPass1234!
+db_host=127.0.0.1
+db_port=1433
\ No newline at end of file
diff --git a/test/resources/config_files/pymssql/wrong_password.cfg b/test/resources/config_files/pymssql/wrong_password.cfg
new file mode 100644
index 0000000..04b37f2
--- /dev/null
+++ b/test/resources/config_files/pymssql/wrong_password.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pymssql
+db_name=db
+db_user=SA
+db_password=wrong
+db_host=127.0.0.1
+db_port=1433
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/charset_invalid.cfg b/test/resources/config_files/pymysql/charset_invalid.cfg
new file mode 100644
index 0000000..9eb9a14
--- /dev/null
+++ b/test/resources/config_files/pymysql/charset_invalid.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pymysql
+db_name=db
+user=db_user
+password=pass
+db_host=127.0.0.1
+db_port=3306
+db_charset=wrong
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/custom_param_password.cfg b/test/resources/config_files/pymysql/custom_param_password.cfg
new file mode 100644
index 0000000..52b68e7
--- /dev/null
+++ b/test/resources/config_files/pymysql/custom_param_password.cfg
@@ -0,0 +1,6 @@
+[default]
+db_module=pymysql
+db_name=db
+password=pass
+db_host=127.0.0.1
+db_port=3306
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/invalid_custom_params.cfg b/test/resources/config_files/pymysql/invalid_custom_params.cfg
new file mode 100644
index 0000000..46975ef
--- /dev/null
+++ b/test/resources/config_files/pymysql/invalid_custom_params.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pymysql
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=3306
+blah=blah
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/old_param_names.cfg b/test/resources/config_files/pymysql/old_param_names.cfg
new file mode 100644
index 0000000..0d73312
--- /dev/null
+++ b/test/resources/config_files/pymysql/old_param_names.cfg
@@ -0,0 +1,7 @@
+[default]
+dbapiModuleName=pymysql
+dbName=db
+dbUsername=db_user
+dbPassword=pass
+dbHost=127.0.0.1
+dbPort=3306
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/simple_default_alias.cfg b/test/resources/config_files/pymysql/simple_default_alias.cfg
new file mode 100644
index 0000000..d4242af
--- /dev/null
+++ b/test/resources/config_files/pymysql/simple_default_alias.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pymysql
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=3306
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/some_basic_params_missing.cfg b/test/resources/config_files/pymysql/some_basic_params_missing.cfg
new file mode 100644
index 0000000..f6c24e4
--- /dev/null
+++ b/test/resources/config_files/pymysql/some_basic_params_missing.cfg
@@ -0,0 +1,3 @@
+[default]
+db_module=pymysql
+db_name=db
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/valid_custom_params.cfg b/test/resources/config_files/pymysql/valid_custom_params.cfg
new file mode 100644
index 0000000..dcd264a
--- /dev/null
+++ b/test/resources/config_files/pymysql/valid_custom_params.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pymysql
+db_name=db
+user=db_user
+password=pass
+db_host=127.0.0.1
+db_port=3306
\ No newline at end of file
diff --git a/test/resources/config_files/pymysql/wrong_password.cfg b/test/resources/config_files/pymysql/wrong_password.cfg
new file mode 100644
index 0000000..5d8921e
--- /dev/null
+++ b/test/resources/config_files/pymysql/wrong_password.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pymysql
+db_name=db
+db_user=db_user
+db_password=wrong
+db_host=127.0.0.1
+db_port=3306
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/charset_invalid.cfg b/test/resources/config_files/pyodbc/charset_invalid.cfg
new file mode 100644
index 0000000..356dbf6
--- /dev/null
+++ b/test/resources/config_files/pyodbc/charset_invalid.cfg
@@ -0,0 +1,9 @@
+[default]
+db_module=pyodbc
+db_name=db
+user=db_user
+password=pass
+db_host=127.0.0.1
+db_port=3306
+odbc_driver={MySQL ODBC 8.0 ANSI Driver}
+db_charset=wrong
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/custom_param_password.cfg b/test/resources/config_files/pyodbc/custom_param_password.cfg
new file mode 100644
index 0000000..56650c9
--- /dev/null
+++ b/test/resources/config_files/pyodbc/custom_param_password.cfg
@@ -0,0 +1,7 @@
+[default]
+db_module=pyodbc
+db_name=db
+PWD=pass
+db_host=127.0.0.1
+db_port=3306
+odbc_driver={MySQL ODBC 8.0 ANSI Driver}
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/invalid_custom_params.cfg b/test/resources/config_files/pyodbc/invalid_custom_params.cfg
new file mode 100644
index 0000000..8bb0d5d
--- /dev/null
+++ b/test/resources/config_files/pyodbc/invalid_custom_params.cfg
@@ -0,0 +1,9 @@
+[default]
+db_module=pyodbc
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=3306
+odbc_driver={MySQL ODBC 8.0 ANSI Driver}
+blah=blah
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/old_param_names.cfg b/test/resources/config_files/pyodbc/old_param_names.cfg
new file mode 100644
index 0000000..d7cf249
--- /dev/null
+++ b/test/resources/config_files/pyodbc/old_param_names.cfg
@@ -0,0 +1,8 @@
+[default]
+dbapiModuleName=pyodbc
+dbName=db
+dbUsername=db_user
+dbPassword=pass
+dbHost=127.0.0.1
+dbPort=3306
+dbDriver={MySQL ODBC 8.0 ANSI Driver}
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/simple_default_alias.cfg b/test/resources/config_files/pyodbc/simple_default_alias.cfg
new file mode 100644
index 0000000..9feac87
--- /dev/null
+++ b/test/resources/config_files/pyodbc/simple_default_alias.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pyodbc
+db_name=db
+db_user=db_user
+db_password=pass
+db_host=127.0.0.1
+db_port=3306
+odbc_driver={MySQL ODBC 8.0 ANSI Driver}
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/some_basic_params_missing.cfg b/test/resources/config_files/pyodbc/some_basic_params_missing.cfg
new file mode 100644
index 0000000..16a3448
--- /dev/null
+++ b/test/resources/config_files/pyodbc/some_basic_params_missing.cfg
@@ -0,0 +1,3 @@
+[default]
+db_module=pyodbc
+db_name=db
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/valid_custom_params.cfg b/test/resources/config_files/pyodbc/valid_custom_params.cfg
new file mode 100644
index 0000000..a51f5e2
--- /dev/null
+++ b/test/resources/config_files/pyodbc/valid_custom_params.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pyodbc
+db_name=db
+UID=db_user
+PWD=pass
+db_host=127.0.0.1
+db_port=3306
+odbc_driver={MySQL ODBC 8.0 ANSI Driver}
\ No newline at end of file
diff --git a/test/resources/config_files/pyodbc/wrong_password.cfg b/test/resources/config_files/pyodbc/wrong_password.cfg
new file mode 100644
index 0000000..150c0c9
--- /dev/null
+++ b/test/resources/config_files/pyodbc/wrong_password.cfg
@@ -0,0 +1,8 @@
+[default]
+db_module=pyodbc
+db_name=db
+db_user=db_user
+db_password=wrong
+db_host=127.0.0.1
+db_port=3306
+odbc_driver={MySQL ODBC 8.0 ANSI Driver}
\ No newline at end of file
diff --git a/test/resources/config_files/sqlite3/old_param_names.cfg b/test/resources/config_files/sqlite3/old_param_names.cfg
new file mode 100644
index 0000000..4a8047b
--- /dev/null
+++ b/test/resources/config_files/sqlite3/old_param_names.cfg
@@ -0,0 +1,4 @@
+[default]
+dbapiModuleName=sqlite3
+database=./${DBName}.db
+isolation_level=
\ No newline at end of file
diff --git a/test/resources/config_files/sqlite3/simple_default_alias.cfg b/test/resources/config_files/sqlite3/simple_default_alias.cfg
new file mode 100644
index 0000000..bdc48bd
--- /dev/null
+++ b/test/resources/config_files/sqlite3/simple_default_alias.cfg
@@ -0,0 +1,4 @@
+[default]
+db_module=sqlite3
+database=./${DBName}.db
+isolation_level=
\ No newline at end of file
diff --git a/test/resources/create_stored_procedures_mssql.sql b/test/resources/create_stored_procedures_mssql.sql
index 79d31ba..14c2ae8 100644
--- a/test/resources/create_stored_procedures_mssql.sql
+++ b/test/resources/create_stored_procedures_mssql.sql
@@ -49,4 +49,21 @@ ELSE
 BEGIN
 PRINT 'Condition is false';
 END
+END;
+
+DROP PROCEDURE IF EXISTS return_out_param_without_result_sets;
+CREATE PROCEDURE 
+return_out_param_without_result_sets
+@my_input VARCHAR(20),
+@my_output INT OUTPUT
+AS
+BEGIN
+ IF @my_input = 'give me 1'
+    BEGIN
+        SELECT @my_output = 1;
+    END
+    ELSE
+    BEGIN
+        SELECT @my_output = 0;
+    END
 END;
\ No newline at end of file
diff --git a/test/tests/common_tests/assertion_error_messages.robot b/test/tests/common_tests/assertion_error_messages.robot
index 35d81e4..28ac504 100644
--- a/test/tests/common_tests/assertion_error_messages.robot
+++ b/test/tests/common_tests/assertion_error_messages.robot
@@ -103,3 +103,31 @@ Verify Row Count Is Greater Than X Fails With Message
     ...    Row Count Is Greater Than X
     ...    ${Existing Select}    1
     ...    msg=${Error Message}
+
+Check Row Count With Assertion Engine Fails
+    ${expected value}=    Set Variable    5
+    ${expected error}=    Catenate
+    ...    Wrong row count: '1' (int) should be '${expected value}' (int)
+    Run Keyword And Expect Error
+    ...    ${expected error}
+    ...    Check Row Count    ${Existing Select}    equals    ${expected value}
+
+Check Row Count With Assertion Engine Fails With Message
+    Run Keyword And Expect Error    ${Error Message}
+    ...    Check Row Count    ${Existing Select}    less than    1
+    ...    assertion_message=${Error Message}
+
+
+Check Query Result With Assertion Engine Fails
+    ${expected value}=    Set Variable    ${5}
+    ${expected error}=    Catenate
+    ...    Wrong query result: '1' (int) should be '${expected value}' (int)
+    Run Keyword And Expect Error
+    ...    ${expected error}
+    ...    Check Query Result    ${Existing Select}    equals    ${expected value}
+
+
+Check Query Result With Assertion Engine Fails With Message
+    Run Keyword And Expect Error    ${Error Message}
+    ...    Check Query Result    ${Existing Select}    less than    ${1}
+    ...    assertion_message=${Error Message}
diff --git a/test/tests/common_tests/assertion_retry.robot b/test/tests/common_tests/assertion_retry.robot
new file mode 100644
index 0000000..47921da
--- /dev/null
+++ b/test/tests/common_tests/assertion_retry.robot
@@ -0,0 +1,60 @@
+*** Settings ***
+Documentation       Tests for assertion keywords with retry mechanism
+
+Resource            ../../resources/common.resource
+
+Suite Setup         Connect To DB And Prepare Data
+Suite Teardown      Delete Data And Disconnect
+Test Setup          Save Start Time
+
+*** Variables ***
+${Timeout}    ${3}
+${Tolerance}    ${0.5}
+${Request}    SELECT first_name FROM person
+
+*** Test Cases ***
+Check Query Results With Timeout - Fast If DB Ready    
+    Check Query Result    ${Request}    contains   Allan    retry_timeout=${Timeout} seconds
+    ${End time}=    Get Current Date
+    ${Execution time}=    Subtract Date From Date    ${End time}    ${START_TIME}    
+    Should Be True   0 <= $Execution_time <= $Tolerance
+
+Check Query Results With Timeout - Slow If Result Wrong    
+    Run Keyword And Expect Error    Wrong query result: 'Franz Allan' (str) should contain 'Blah' (str)
+    ...    Check Query Result    ${Request}    contains   Blah    retry_timeout=${Timeout} seconds   retry_pause=1s
+    ${End time}=    Get Current Date
+    ${Execution time}=    Subtract Date From Date    ${End time}    ${START_TIME}    
+    Should Be True   $Timeout <= $Execution_time <= $Timeout + $Tolerance
+
+Check Query Results With Timeout - Slow If Row Count Wrong    
+    Run Keyword And Expect Error    Checking row '5' is not possible, as query results contain 2 rows only!
+    ...    Check Query Result    ${Request}    contains   Blah    row=5    retry_timeout=${Timeout} seconds
+    ${End time}=    Get Current Date
+    ${Execution time}=    Subtract Date From Date    ${End time}    ${START_TIME}
+    Should Be True   $Timeout <= $Execution_time <= $Timeout + $Tolerance
+
+Check Row Count With Timeout - Fast If DB Ready    
+    Check Row Count    ${Request}    ==   2    retry_timeout=${Timeout} seconds
+    ${End time}=    Get Current Date
+    ${Execution time}=    Subtract Date From Date    ${End time}    ${START_TIME}    
+    Should Be True   0 <= $Execution_time <= $Tolerance
+
+Check Row Count With Timeout - Slow If Result Wrong    
+    Run Keyword And Expect Error    Wrong row count: '2' (int) should be greater than '5' (int)
+    ...    Check Row Count    ${Request}    >   5    retry_timeout=${Timeout} seconds   retry_pause=1s
+    ${End time}=    Get Current Date
+    ${Execution time}=    Subtract Date From Date    ${End time}    ${START_TIME}    
+    Should Be True   $Timeout <= $Execution_time <= $Timeout + $Tolerance
+
+*** Keywords ***
+Connect To DB And Prepare Data
+    Connect To DB
+    Create Person Table And Insert Data
+
+Delete Data And Disconnect
+    Drop Tables Person And Foobar
+    Disconnect From Database
+
+Save Start Time
+    ${START_TIME}=    Get Current Date
+    Set Suite Variable    ${START_TIME}
diff --git a/test/tests/common_tests/basic_tests.robot b/test/tests/common_tests/basic_tests.robot
index 2fe17bc..d836b4d 100644
--- a/test/tests/common_tests/basic_tests.robot
+++ b/test/tests/common_tests/basic_tests.robot
@@ -63,6 +63,23 @@ Retrieve Row Count
     Log    ${output}
     Should Be Equal As Strings    ${output}    2
 
+Check Row Count With Assertion Engine
+    Check Row Count    SELECT id FROM person    ==    2
+
+Check Query Result With Assertion Engine
+    Check Query Result    SELECT first_name FROM person    contains   Allan
+
+Check Query Result With Assertion Engine - Different Row And Col
+    Check Query Result    SELECT first_name, last_name, id FROM person    >=   ${2}    row=1    col=2
+
+Check Query Result With Assertion Engine - Row Out Of Range
+    Run Keyword And Expect Error    Checking row '2' is not possible, as query results contain 2 rows only!
+    ...    Check Query Result    SELECT first_name FROM person    ==   Blah    row=2
+
+Check Query Result With Assertion Engine - Col Out Of Range
+    Run Keyword And Expect Error    Checking column '5' is not possible, as query results contain 2 columns only!
+    ...    Check Query Result    SELECT id, first_name FROM person    ==   Blah    col=5
+
 Retrieve records from person table
     ${output}=    Execute SQL String    SELECT * FROM person
     Log    ${output}
diff --git a/test/tests/common_tests/connection_params.robot b/test/tests/common_tests/connection_params.robot
new file mode 100644
index 0000000..00c0810
--- /dev/null
+++ b/test/tests/common_tests/connection_params.robot
@@ -0,0 +1,174 @@
+*** Settings ***
+Documentation       Tests for the basic _Connect To Database_ keyword - with and without config files.
+...    The parameter handling is partly DB module specific.
+
+Resource            ../../resources/common.resource
+
+Test Setup          Skip If    $DB_MODULE == "sqlite3"
+Test Teardown       Disconnect From Database
+
+*** Variables ***
+&{Errors psycopg2}
+...    missing basic params=OperationalError: connection to server on socket *
+...    invalid custom param=ProgrammingError: invalid dsn: invalid connection option "blah"*
+&{Errors oracledb}
+...    missing basic params=DatabaseError: DPY-4001: no credentials specified
+...    invalid custom param=TypeError: connect() got an unexpected keyword argument 'blah'
+&{Errors pymssql}
+...    missing basic params=OperationalError: (20002, b'DB-Lib error message 20002, severity 9*
+...    invalid custom param=TypeError: connect() got an unexpected keyword argument 'blah'
+&{Errors pymysql}
+...    missing basic params=OperationalError: (1045, "Access denied*
+...    invalid custom param=TypeError: __init__() got an unexpected keyword argument 'blah'
+&{Errors pyodbc}
+...    missing basic params=REGEXP: InterfaceError.*Data source name not found and no default driver specified.*
+
+&{Errors}
+...    psycopg2=${Errors psycopg2}
+...    oracledb=${Errors oracledb}
+...    pymssql=${Errors pymssql}
+...    pymysql=${Errors pymysql}
+...    pyodbc=${Errors pyodbc}
+
+
+*** Test Cases ***
+Mandatory params can't be missing
+    Run Keyword And Expect Error    
+    ...    ValueError: Required parameter 'db_module' was not provided*
+    ...    Connect To Database    db_name=${DB_NAME}
+
+All basic params, no config file
+    Connect To Database
+    ...    db_module=${DB_MODULE}
+    ...    db_name=${DB_NAME}
+    ...    db_user=${DB_USER}
+    ...    db_password=${DB_PASS}
+    ...    db_host=${DB_HOST}
+    ...    db_port=${DB_PORT}
+    ...    odbc_driver=${DB_DRIVER}
+
+Missing basic params are accepted, error from Python DB module
+    Run Keyword And Expect Error    
+    ...    ${Errors}[${DB_MODULE}][missing basic params]
+    ...    Connect To Database
+    ...    db_module=${DB_MODULE}
+
+Custom params as keyword args - valid
+    Connect To Database
+    ...    db_module=${DB_MODULE}
+    ...    db_name=${DB_NAME}    
+    ...    db_host=${DB_HOST}
+    ...    db_port=${DB_PORT}
+    ...    odbc_driver=${DB_DRIVER}
+    ...    user=${DB_USER}
+    ...    password=${DB_PASS}
+
+Custom params as keyword args - invalid, error from Python DB module
+    Skip If    $DB_MODULE == "pyodbc"    
+    ...    pyodbc doesn't always throw an error if some wrong parameter was provided
+    Run Keyword And Expect Error    
+    ...    ${Errors}[${DB_MODULE}][invalid custom param]
+    ...    Connect To Database
+    ...    db_module=${DB_MODULE}
+    ...    db_name=${DB_NAME}    
+    ...    db_host=${DB_HOST}
+    ...    db_port=${DB_PORT}
+    ...    db_user=${DB_USER}
+    ...    db_password=${DB_PASS}
+    ...    odbc_driver=${DB_DRIVER}
+    ...    blah=blah
+
+All basic params in config file
+    Connect Using Config File    ${DB_MODULE}/simple_default_alias
+
+Deprecated basic params in config file
+    Connect Using Config File    ${DB_MODULE}/old_param_names
+
+Missing basic params in config file are accepted, error from Python DB module
+    Run Keyword And Expect Error    
+    ...    ${Errors}[${DB_MODULE}][missing basic params]
+    ...    Connect Using Config File    
+    ...    ${DB_MODULE}/some_basic_params_missing
+
+Custom params from config file - valid
+    Connect Using Config File    ${DB_MODULE}/valid_custom_params
+
+Custom params from config file - invalid, error from Python DB module
+    Skip If    $DB_MODULE == "pyodbc"    
+    ...    pyodbc doesn't always throw an error if some wrong parameter was provided
+    Run Keyword And Expect Error    
+    ...    ${Errors}[${DB_MODULE}][invalid custom param]
+    ...    Connect Using Config File    ${DB_MODULE}/invalid_custom_params
+
+Custom params as keyword args combined with custom params from config file
+    Connect Using Config File    ${DB_MODULE}/custom_param_password    
+    ...    user=${DB_USER}
+    
+
+Keyword args override config file values - basic params
+    Connect Using Config File    ${DB_MODULE}/wrong_password
+    ...    db_password=${DB_PASS}
+
+Keyword args override config file values - custom params
+    Connect Using Config File    ${DB_MODULE}/valid_custom_params
+    ...    user=${DB_USER}
+
+Oracle specific - basic params, no config file, oracle_driver_mode
+    Skip If    $DB_MODULE != "oracledb"
+    Connect To Database
+    ...    db_module=${DB_MODULE}
+    ...    db_name=${DB_NAME}
+    ...    db_user=${DB_USER}
+    ...    db_password=${DB_PASS}
+    ...    db_host=${DB_HOST}
+    ...    db_port=${DB_PORT}
+    ...    oracle_driver_mode=thin
+
+Oracle specific - thick mode in config file - invalid
+    [Documentation]    Invalid as mode switch during test execution is not supported
+    ...    This test must run the last one in the suite, after others used thin mode already.
+    Skip If    $DB_MODULE != "oracledb"
+    Run Keyword And Expect Error    ProgrammingError: DPY-2019: python-oracledb thick mode cannot be used because a thin mode connection has already been created
+    ...    Connect Using Config File    ${DB_MODULE}/thick_mode
+
+
+MSSQL / MySQL / PyODBC specific - charset as keyword argument
+    Skip If    $DB_MODULE not in ["pymssql", "pymysql", "pyodbc"]
+    Connect To Database
+    ...    db_module=${DB_MODULE}
+    ...    db_name=${DB_NAME}
+    ...    db_user=${DB_USER}
+    ...    db_password=${DB_PASS}
+    ...    db_host=${DB_HOST}
+    ...    db_port=${DB_PORT}
+    ...    odbc_driver=${DB_DRIVER}
+    ...    db_charset=LATIN1
+
+MSSQL specific - charset in config file - invalid
+    Skip If    $DB_MODULE not in ["pymssql"]
+    Run Keyword And Expect Error    OperationalError: (20002, b'Unknown error')
+    ...    Connect Using Config File    ${DB_MODULE}/charset_invalid
+
+MySQL specific - charset in config file - invalid
+    Skip If    $DB_MODULE not in ["pymysql"]
+    Run Keyword And Expect Error    AttributeError: 'NoneType' object has no attribute 'encoding'
+    ...    Connect Using Config File    ${DB_MODULE}/charset_invalid
+
+PyODBC specific - charset in config file - invalid
+    Skip If    $DB_MODULE not in ["pyodbc"]
+    Run Keyword And Expect Error    REGEXP: .*Can't initialize character set wrong.*
+    ...    Connect Using Config File    ${DB_MODULE}/charset_invalid
+
+
+SQlite specific - connection params as custom keyword args
+    [Setup]    Skip If    $DB_MODULE != "sqlite3"
+    Remove File    ${DBName}.db
+    Connect To Database
+    ...    db_module=${DB_MODULE}
+    ...    database=./${DBName}.db
+    ...    isolation_level=${EMPTY}
+
+SQlite specific - custom connection params in config file
+    [Setup]    Skip If    $DB_MODULE != "sqlite3"
+    Remove File    ${DBName}.db
+    Connect Using Config File    ${DB_MODULE}/simple_default_alias
diff --git a/test/tests/common_tests/import_params.robot b/test/tests/common_tests/import_params.robot
new file mode 100644
index 0000000..b699f0f
--- /dev/null
+++ b/test/tests/common_tests/import_params.robot
@@ -0,0 +1,14 @@
+*** Settings ***
+Documentation    Tests for parameters used when importing the library
+
+*** Test Cases ***
+Import Without Parameters Is Valid
+    Import Library    DatabaseLibrary
+
+Log Query Results Params Cause No Crash
+    Import Library    DatabaseLibrary    log_query_results=False    log_query_results_head=0
+
+Log Query Results Head - Negative Value Not Allowed
+    Run Keyword And Expect Error
+    ...    STARTS: Initializing library 'DatabaseLibrary' with arguments [ log_query_results_head=-1 ] failed: ValueError: Wrong log head value provided: -1. The value can't be negative!
+    ...    Import Library    DatabaseLibrary    log_query_results_head=-1
\ No newline at end of file
diff --git a/test/tests/common_tests/log_query_results.robot b/test/tests/common_tests/log_query_results.robot
new file mode 100644
index 0000000..4b4270b
--- /dev/null
+++ b/test/tests/common_tests/log_query_results.robot
@@ -0,0 +1,15 @@
+*** Settings ***
+Documentation       Tests for keywords controlling the logging query results
+
+Resource            ../../resources/common.resource
+
+Suite Setup         Connect To DB
+Suite Teardown      Disconnect From Database
+Test Setup          Create Person Table And Insert Data
+Test Teardown       Drop Tables Person And Foobar
+
+*** Test Cases ***
+Calling The Keyword Causes No Crash
+    Set Logging Query Results    enabled=False
+    Set Logging Query Results    enabled=True    log_head=0
+    Set Logging Query Results    log_head=30
\ No newline at end of file
diff --git a/test/tests/common_tests/stored_procedures.robot b/test/tests/common_tests/stored_procedures.robot
index e0cad5b..7cc136a 100644
--- a/test/tests/common_tests/stored_procedures.robot
+++ b/test/tests/common_tests/stored_procedures.robot
@@ -91,6 +91,22 @@ Procedure Returns Multiple Result Sets
 Procedure With IF/ELSE Block
     Call Stored Procedure    check_condition
 
+MSSQL Procedure Returns OUT Param Without Result Sets
+    IF    "${DB_MODULE}" not in ["pymssql"]
+        Skip    This test is valid for pymssql only
+    END
+    @{params}=    Create List    give me 1    
+    @{out_params}=    Create List    ${9}    
+    ${param values}    ${result sets}=    Call Stored Procedure    return_out_param_without_result_sets    
+    ...    ${params}    additional_output_params=${out_params}
+    Should Be Empty    ${result sets}
+    Should Be Equal As Integers    ${param values}[1]    1
+    @{params}=    Create List    give me 0
+    ${param values}    ${result sets}=    Call Stored Procedure    return_out_param_without_result_sets    
+    ...    ${params}    additional_output_params=${out_params}
+        Should Be Empty    ${result sets}
+    Should Be Equal As Integers    ${param values}[1]    0
+
 
 *** Keywords ***
 Create And Fill Tables And Stored Procedures
diff --git a/test/tests/custom_db_tests/oracle_omit_semicolon.robot b/test/tests/custom_db_tests/oracle_omit_semicolon.robot
index de2db7d..2ba6bd2 100644
--- a/test/tests/custom_db_tests/oracle_omit_semicolon.robot
+++ b/test/tests/custom_db_tests/oracle_omit_semicolon.robot
@@ -20,8 +20,8 @@ ${PLSQL BLOCK}    DECLARE ERRCODE NUMBER; ERRMSG VARCHAR2(200); BEGIN DBMS_OUTPU
 Explicitely Omit Semicolon
     [Documentation]    Check if it works for Oracle - explicitely omitting the semicolon
     ...    is equal to the default behaviour, otherwise oracle_db throws an error
-    Execute Sql String    ${NORMAL QUERY}    omitTrailingSemicolon=True
+    Execute Sql String    ${NORMAL QUERY}    omit_trailing_semicolon=True
 
 Explicitely Dont't Omit Semicolon
     [Documentation]    Check if it works for Oracle - it throws an error without a semicolon
-    Execute Sql String    ${PLSQL BLOCK}    omitTrailingSemicolon=False
+    Execute Sql String    ${PLSQL BLOCK}    omit_trailing_semicolon=False
diff --git a/test/tests/custom_db_tests/oracle_thick_mode.robot b/test/tests/custom_db_tests/oracle_thick_mode.robot
index e9ba1e9..73d03e2 100644
--- a/test/tests/custom_db_tests/oracle_thick_mode.robot
+++ b/test/tests/custom_db_tests/oracle_thick_mode.robot
@@ -24,11 +24,11 @@ ${ORACLE_LIB_DIR}       ${EMPTY}
 *** Test Cases ***
 Thick Mode Without Client Dir Specified
     [Documentation]    No client dir --> oracledb will search it in usual places
-    Connect And Run Simple Query    driverMode=thick
+    Connect And Run Simple Query    oracle_driver_mode=thick
 
 Thick Mode With Client Dir Specified
     [Documentation]    Client dir specified --> oracledb will search it in this place
-    Connect And Run Simple Query    driverMode=thick,lib_dir=${ORACLE_LIB_DIR}
+    Connect And Run Simple Query    oracle_driver_mode=thick,lib_dir=${ORACLE_LIB_DIR}
 
 Thin Mode - Default
     [Documentation]    No mode specified --> thin mode is used
@@ -36,12 +36,12 @@ Thin Mode - Default
 
 Thin Mode Explicitely Specified
     [Documentation]    Thin mode specified --> thin mode is used
-    Connect And Run Simple Query  driverMode=thin
+    Connect And Run Simple Query  oracle_driver_mode=thin
 
 Wrong Mode
     [Documentation]    Wrong mode --> proper error message from the library
     Run Keyword And Expect Error    ValueError: Invalid Oracle client mode provided: wrong
-    ...    Connect And Run Simple Query    driverMode=wrong
+    ...    Connect And Run Simple Query    oracle_driver_mode=wrong
 
 
 *** Keywords ***
diff --git a/test/tests/utests/test_connection_manager.py b/test/tests/utests/test_connection_manager.py
index bbc9ea2..f53d8f0 100644
--- a/test/tests/utests/test_connection_manager.py
+++ b/test/tests/utests/test_connection_manager.py
@@ -13,22 +13,11 @@ class TestConnectWithConfigFile:
     def test_connect_with_empty_config(self):
         conn_manager = ConnectionManager()
         config_path = str(TEST_DATA / "empty.cfg")
-        with pytest.raises(ValueError, match=re.escape("Configuration file does not have [default] section.")):
-            conn_manager.connect_to_database("my_client", dbConfigFile=config_path)
-
-    def test_connect_no_params_no_config(self):
-        conn_manager = ConnectionManager()
-        with pytest.raises(ValueError, match="Required 'dbName' parameter was not provided in keyword arguments."):
-            conn_manager.connect_to_database("my_client")
-
-    def test_connect_missing_option(self):
-        conn_manager = ConnectionManager()
-        config_path = str(TEST_DATA / "no_option.cfg")
         with pytest.raises(
             ValueError,
-            match="Required 'dbPassword' parameter missing in both keyword arguments and configuration file.",
+            match="Required parameter 'db_module' was not provided - neither in keyword arguments nor in config file",
         ):
-            conn_manager.connect_to_database("my_client", dbConfigFile=config_path)
+            conn_manager.connect_to_database(config_file=config_path)
 
     def test_aliased_section(self):
         conn_manager = ConnectionManager()
@@ -36,11 +25,11 @@ def test_aliased_section(self):
         with patch("importlib.import_module", new=MagicMock()) as client:
             conn_manager.connect_to_database(
                 "my_client",
-                dbUsername="name",
-                dbPassword="password",
-                dbHost="host",
-                dbPort=0,
-                dbConfigFile=config_path,
+                db_user="name",
+                db_password="password",
+                db_host="host",
+                db_port=0,
+                config_file=config_path,
                 alias="alias2",
             )
             client.return_value.connect.assert_called_with(
diff --git a/test/tests/utests/test_data/alias.cfg b/test/tests/utests/test_data/alias.cfg
index 06d0431..51b5ee5 100644
--- a/test/tests/utests/test_data/alias.cfg
+++ b/test/tests/utests/test_data/alias.cfg
@@ -1,2 +1,2 @@
 [alias2]
-dbName = example
+db_name = example
diff --git a/test/tests/utests/test_data/no_option.cfg b/test/tests/utests/test_data/no_option.cfg
index 4e0db9e..53c0731 100644
--- a/test/tests/utests/test_data/no_option.cfg
+++ b/test/tests/utests/test_data/no_option.cfg
@@ -1,3 +1,3 @@
 [default]
-dbName = example
-dbUsername = example
\ No newline at end of file
+db_name = example
+db_user = example
\ No newline at end of file