code: def batch_update(self, statements):
          
          parsed = []
          for statement in statements:
              if isinstance(statement, str):
                  parsed.append({"sql": statement})
              else:
                  dml, params, param_types = statement
                  params_pb = self._make_params_pb(params, param_types)
                  parsed.append(
                      {"sql": dml, "params": params_pb, "param_types": param_types}
                  )
  
          database = self._session._database
          metadata = _metadata_with_prefix(database.name)
          transaction = self._make_txn_selector()
          api = database.spanner_api
  
          response = api.execute_batch_dml(
              session=self._session.name,
              transaction=transaction,
              statements=parsed,
              seqno=self._execute_sql_count,
              metadata=metadata,
          )
  
          self._execute_sql_count += 1
          row_counts = [
              result_set.stats.row_count_exact for result_set in response.result_sets
          ]
          return response.status, row_counts
docs: Perform a batch of DML statements via an ``ExecuteBatchDml`` request.
  
          :type statements:
              Sequence[Union[ str, Tuple[str, Dict[str, Any], Dict[str, Union[dict, .types.Type]]]]]
  
          :param statements:
              List of DML statements, with optional params / param types.
              If passed, 'params' is a dict mapping names to the values
              for parameter replacement.  Keys must match the names used in the
              corresponding DML statement.  If 'params' is passed, 'param_types'
              must also be passed, as a dict mapping names to the type of
              value passed in 'params'.
  
          :rtype:
              Tuple(status, Sequence[int])
          :returns:
              Status code, plus counts of rows affected by each completed DML
              statement.  Note that if the staus code is not ``OK``, the
              statement triggering the error will not have an entry in the
              list, nor will any statements following that one.