0

I am working on Robot Framework, one of my base method is written in python for building a SQL query with n columns and multiple where conditions. The function looks like,

from pypika import Query, Table, Field
def get_query_with_filter_conditions(table_name, *column, **where):
    table_name_with_no_lock = table_name + ' with (nolock)'
    table = Table(table_name_with_no_lock)
    where_condition = get_where_condition(**where)
    sql_query = Query.from_(table).select(
        *column
    ).where(
        Field(where_condition)
    )
    return str(sql_query).replace('"', '')

I am calling this method in my Robot keywords as:

Get Query With Filter Conditions    ${tableName}    ${column}    &{tableFilter}

This function is called in two other keywords. For one it works fine. for another it keeps throwing error as

Keyword 'queryBuilderUtility.Get Query With Filter Conditions' got multiple values for argument 'table_name'.

The Keyword that works fine looks as:

Verify the ${element} in ${grid} is fetched from ${column} column in ${tableName} table from DB
    [Documentation]    Verifies Monetary values in the View Sale Grid
    ${feature}=    Get Variable Value    ${FEATURE_NAME}
    ${filterValue}=    Get Variable value    ${FILTER_VALUE}
    ${queryFilter}=    Get the Test Data    valid    ${filterValue}    ${feature}
    &{tableFilter}=    Create Dictionary
    Set To Dictionary    ${tableFilter}    ${filterValue}=${queryFilter}
    Set To Dictionary    ${tableFilter}    form_of_payment_type=${element}
    ${tableName}=    Catenate    SEPARATOR=.    SmartPRASales    ${tableName}
    ${query}=    Get query with Filter Conditions    ${tableName}    ${column}    &{tableFilter}
    Log    ${query}
    @{queryResult}=    CommonPage.Get a Column values from DB    ${query}

The functions That always throws error looks like:

Verify ${element} drop down contains all values from ${column} column in ${tableName} table
    [Documentation]    To verify the drop down has all values from DB
    ${feature}=    Get Variable Value    ${FEATURE_NAME}
    ${filterElement}=    Run Keyword If    '${element}'=='batch_type'    Set Variable    transaction_type
    ...    ELSE IF    '${element}'=='channel'    Set Variable    agency_type
    ...    ELSE    Set Variable    ${element}
    &{tableFilter}=    Create Dictionary
    Set To Dictionary    ${tableFilter}    table_name=GENERAL
    Set To Dictionary    ${tableFilter}    column_name=${filterElement}
    Set To Dictionary    ${tableFilter}    client_id=QR
    Log    ${tableFilter}
    Log    ${tableName}
    Log    ${column}
    ${tableName}=    Catenate    SEPARATOR=.    SmartPRAMaster    ${tableName}
    ${query}=    Get Query With Filter Conditions    ${tableName}    ${column}    &{tableFilter}
    Log    ${query}
    @{expectedvalues}=    CommonPage.Get a Column values from DB    ${query}

Can someone help me to get rectified what is the mistake I am doing here?

  • `${tableName} ${column} &{tableFilter}` check the content of all this 3 variables in both functions and if possible add same to the post – Dev Sep 22 '20 at 12:17
  • .@Dev For the working keyword: ${tableFilter} => {'document_no': '5088397227', 'form_of_payment_type': 'GF'}, ${tableName} => SmartPRASales.ticket_payment_details, ${column} => form_of_payment_amount. For the function that throws error: ${tableFilter} => {'table_name': 'GENERAL', 'column_name': 'sales_source', 'client_id': 'QR'} , ${tableName} => SmartPRAMaster.mas_list_of_values, ${column} => field_short_desc – Bhuvaneshwari K Sep 22 '20 at 12:44

1 Answers1

1

The issue is due to key value pair in the dictionary. One of the key in the dictionary

&{tableFilter}=    Create Dictionary
    Set To Dictionary    ${tableFilter}    table_name=GENERAL

is same as that of one of the argument in the

def get_query_with_filter_conditions(table_name, *column, **where):

Changed the argument in get_query_with_filter_conditions function from table_name to p_table_name and it worked. As the function takes positional arguments which can be specified as named parameter, python got confused with the table_name parameter I have passed with that of the key table_name in the dictionary.

  • You can accept your answer by clicking on hollow tick beside the answer after 24 hours of answer time – Dev Sep 23 '20 at 09:14