Skip to content

Commit 7e73e78

Browse files
authored
Add 'Query.num_dml_affected_rows' property. (#3460)
Read-only, set from servier-provided 'numDmlAffectedRows' field. Closes #2920.
1 parent 5e86158 commit 7e73e78

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

bigquery/google/cloud/bigquery/query.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,20 @@ def total_bytes_processed(self):
226226
if total_bytes_processed is not None:
227227
return int(total_bytes_processed)
228228

229+
@property
230+
def num_dml_affected_rows(self):
231+
"""Total number of rows affected by a DML query.
232+
233+
See:
234+
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query#numDmlAffectedRows
235+
236+
:rtype: int, or ``NoneType``
237+
:returns: Count generated on the server (None until set by the server).
238+
"""
239+
num_dml_affected_rows = self._properties.get('numDmlAffectedRows')
240+
if num_dml_affected_rows is not None:
241+
return int(num_dml_affected_rows)
242+
229243
@property
230244
def rows(self):
231245
"""Query results.

bigquery/tests/unit/test_query.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def _makeResource(self, complete=False):
7070
]
7171
resource['pageToken'] = self.TOKEN
7272
resource['totalBytesProcessed'] = 100000
73+
resource['numDmlAffectedRows'] = 123
7374
resource['cacheHit'] = False
7475

7576
return resource
@@ -124,10 +125,12 @@ def _verifyResourceProperties(self, query, resource):
124125
self.assertEqual(query.complete, resource.get('jobComplete'))
125126
self.assertEqual(query.errors, resource.get('errors'))
126127
self.assertEqual(query.page_token, resource.get('pageToken'))
128+
127129
if 'totalRows' in resource:
128130
self.assertEqual(query.total_rows, int(resource['totalRows']))
129131
else:
130132
self.assertIsNone(query.total_rows)
133+
131134
if 'totalBytesProcessed' in resource:
132135
self.assertEqual(query.total_bytes_processed,
133136
int(resource['totalBytesProcessed']))
@@ -139,6 +142,12 @@ def _verifyResourceProperties(self, query, resource):
139142
else:
140143
self.assertIsNone(query.name)
141144

145+
if 'numDmlAffectedRows' in resource:
146+
self.assertEqual(query.num_dml_affected_rows,
147+
int(resource['numDmlAffectedRows']))
148+
else:
149+
self.assertIsNone(query.num_dml_affected_rows)
150+
142151
self._verify_udf_resources(query, resource)
143152
self._verifyQueryParameters(query, resource)
144153
self._verifySchema(query, resource)
@@ -371,6 +380,27 @@ def test_total_bytes_processed_present_string(self):
371380
query._set_properties(resource)
372381
self.assertEqual(query.total_bytes_processed, TOTAL_BYTES_PROCESSED)
373382

383+
def test_num_dml_affected_rows_missing(self):
384+
client = _Client(self.PROJECT)
385+
query = self._make_one(self.QUERY, client)
386+
self.assertIsNone(query.num_dml_affected_rows)
387+
388+
def test_num_dml_affected_rows_present_integer(self):
389+
DML_AFFECTED_ROWS = 123456
390+
client = _Client(self.PROJECT)
391+
query = self._make_one(self.QUERY, client)
392+
resource = {'numDmlAffectedRows': DML_AFFECTED_ROWS}
393+
query._set_properties(resource)
394+
self.assertEqual(query.num_dml_affected_rows, DML_AFFECTED_ROWS)
395+
396+
def test_num_dml_affected_rows_present_string(self):
397+
DML_AFFECTED_ROWS = 123456
398+
client = _Client(self.PROJECT)
399+
query = self._make_one(self.QUERY, client)
400+
resource = {'numDmlAffectedRows': str(DML_AFFECTED_ROWS)}
401+
query._set_properties(resource)
402+
self.assertEqual(query.num_dml_affected_rows, DML_AFFECTED_ROWS)
403+
374404
def test_schema(self):
375405
client = _Client(self.PROJECT)
376406
query = self._make_one(self.QUERY, client)

0 commit comments

Comments
 (0)