docs: def executeSQL(conn, sql, args=None):
      '''
      args: if sql has parameters defined with either %s or %(key)s then args should be a either list or dict of parameter
      values respectively.
      executes sql statement.  useful for executing statements like CREATE TABLE or RENAME TABLE,
      which do not have an result like insert id or a rowset.
      returns: the number of rows affected by the sql statement if any.
      '''
      with doCursor(conn) as cursor:
          numRowsAffected = cursor.execute(sql, args)
          return numRowsAffected