code: def execute_update(self, dml, params=None, param_types=None, query_mode=None):
          
          params_pb = self._make_params_pb(params, param_types)
          database = self._session._database
          metadata = _metadata_with_prefix(database.name)
          transaction = self._make_txn_selector()
          api = database.spanner_api
  
          response = api.execute_sql(
              self._session.name,
              dml,
              transaction=transaction,
              params=params_pb,
              param_types=param_types,
              query_mode=query_mode,
              seqno=self._execute_sql_count,
              metadata=metadata,
          )
  
          self._execute_sql_count += 1
          return response.stats.row_count_exact
docs: Perform an ``ExecuteSql`` API request with DML.
  
          :type dml: str
          :param dml: SQL DML statement
  
          :type params: dict, {str -> column value}
          :param params: values for parameter replacement.  Keys must match
                         the names used in ``dml``.
  
          :type param_types: dict[str -> Union[dict, .types.Type]]
          :param param_types:
              (Optional) maps explicit types for one or more param values;
              required if parameters are passed.
  
          :type query_mode:
              :class:`google.cloud.spanner_v1.proto.ExecuteSqlRequest.QueryMode`
          :param query_mode: Mode governing return of results / query plan. See
              https://cloud.google.com/spanner/reference/rpc/google.spanner.v1#google.spanner.v1.ExecuteSqlRequest.QueryMode1
  
          :rtype: int
          :returns: Count of rows affected by the DML statement.