code: def fake_print(self):
      '''
      This is the overridden __str__ method for Operation
      Recursively prints out the actual query to be executed
      '''
      def _fake_run():
          kwargs = self.kwargs.copy()
          kwargs['generate'] = True
          return _fake_handle_result(
              getattr(self.migrator, self.method)(*self.args, **kwargs)
          )
  
      def _fake_handle_result(result):
          if isinstance(result, Node):
              sql, params = self._parse_node(result)
              return (sql, params)
          elif isinstance(result, Operation):
              return str(result)
          elif isinstance(result, (list, tuple)):
              return '\n'.join([str(_fake_handle_result(item)) for item in result])
  
      return str(_fake_run()f fake_print(self):
      '''
      This is the overridden __str__ method for Operation
      Recursively prints out the actual query to be executed
      '''
      def _fake_run():
          kwargs = self.kwargs.copy()
          kwargs['generate'] = True
          return _fake_handle_result(
              getattr(self.migrator, self.method)(*self.args, **kwargs)
          )
  
      def _fake_handle_result(result):
          if isinstance(result, Node):
              sql, params = self._parse_node(result)
              return (sql, params)
          elif isinstance(result, Operation):
              return str(result)
          elif isinstance(result, (list, tuple)):
              return '\n'.join([str(_fake_handle_result(item)) for item in result])
  
      return str(_fake_run())
docs: This is the overridden __str__ method for Operation
      Recursively prints out the actual query to be executed