def run_query_table_multi(  search, and_flag=False ):
        if and_flag is True:
            combo = " and "
        else:
            combo = " or  "
        try:
                conn = mariadb.connect(
                user=self.user,
                password=self.password,
                host=self.host,
                port=self.port,
                database=self.database
                )
        except mariadb.Error as e:
                print(f"Error connecting to MariaDB Platform: {e}", e)
                sys.exit(1)

            # Get Cursor
        cur = conn.cursor()

        my_sql_qry = "SELECT rec_id, title, http from recipe where"
        q_bld = ""
        while len(search) > 0:
            item = search.pop()
            if len(search) > 0:
                q_bld =  q_bld + "( title like " +   "'%" + item + "%'" + ")" + combo 
            else:
                q_bld =  q_bld  + "( title like "  +  "'%" + item + "%'" ")"

        try:
            cur.execute(my_sql_qry + q_bld) 
        except mariadb.Error as e:
            print(f"Error: {e}")
            return None

This will result in a query using arbitrary items in a list

 

run_query_table_multi( ["Ham', "Cheese"], True )

will output SQL ===>


SELECT rec_id, title, http from recipe where( title like '%Cheese%') and ( title like '%Ham%')

Here is how it looks after a bit of refactoring

Used functools filter to get rid of any blanks.   If you run “or” with a blank – it will select the entire table.

This can support as many as the db can take.

also pass what field you are selection on.

def build_query(self,  field, psearch, combo):
        like_field = "( " + field + " like " 
        q_bld = ""
        psearch = list(filter(None,psearch))
        print("qsearch: ", psearch)
        while len(psearch) > 0:
            item = psearch.pop()
            if len(item) < 1:
                continue;
            if len(psearch) > 0:
                q_bld =  q_bld + like_field +   "'%" + item + "%'" + ")" + combo 
            else:
                q_bld =  q_bld  + like_field   +  "'%" + item + "%'" ")"
        return q_bld

A sample call

 

my_sql_qry = "SELECT rec_id, title, http from recipe where"
field = "title"
combo = " and "

q_bld = self.build_query(field, psearch, combo)

try:
    cur.execute(my_sql_qry + q_bld)          
except mariadb.Error as e:
    print(f"Error: {e}")
    return None

 

Leave a Reply