Skip to content

Commit 1cb30f1

Browse files
committed
Add default LoadJobConfig to Client
1 parent 8270a10 commit 1cb30f1

File tree

3 files changed

+349
-8
lines changed

3 files changed

+349
-8
lines changed

google/cloud/bigquery/client.py

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ class Client(ClientWithProject):
210210
default_query_job_config (Optional[google.cloud.bigquery.job.QueryJobConfig]):
211211
Default ``QueryJobConfig``.
212212
Will be merged into job configs passed into the ``query`` method.
213+
default_load_job_config (Optional[google.cloud.bigquery.job.LoadJobConfig]):
214+
Default ``LoadJobConfig``.
215+
Will be merged into job configs passed into the ``load_table_*`` methods.
213216
client_info (Optional[google.api_core.client_info.ClientInfo]):
214217
The client info used to send a user-agent string along with API
215218
requests. If ``None``, then default info will be used. Generally,
@@ -235,6 +238,7 @@ def __init__(
235238
_http=None,
236239
location=None,
237240
default_query_job_config=None,
241+
default_load_job_config=None,
238242
client_info=None,
239243
client_options=None,
240244
) -> None:
@@ -260,6 +264,7 @@ def __init__(
260264
self._connection = Connection(self, **kw_args)
261265
self._location = location
262266
self._default_query_job_config = copy.deepcopy(default_query_job_config)
267+
self._default_load_job_config = copy.deepcopy(default_load_job_config)
263268

264269
@property
265270
def location(self):
@@ -277,6 +282,17 @@ def default_query_job_config(self):
277282
def default_query_job_config(self, value: QueryJobConfig):
278283
self._default_query_job_config = copy.deepcopy(value)
279284

285+
@property
286+
def default_load_job_config(self):
287+
"""Default ``LoadJobConfig``.
288+
Will be merged into job configs passed into the ``load_table_*`` methods.
289+
"""
290+
return self._default_load_job_config
291+
292+
@default_load_job_config.setter
293+
def default_load_job_config(self, value: LoadJobConfig):
294+
self._default_load_job_config = copy.deepcopy(value)
295+
280296
def close(self):
281297
"""Close the underlying transport objects, releasing system resources.
282298
@@ -2348,9 +2364,19 @@ def load_table_from_uri(
23482364

23492365
destination = _table_arg_to_table_ref(destination, default_project=self.project)
23502366

2367+
# Make a copy so that the job config isn't modified in-place.
23512368
if job_config:
2352-
job_config = copy.deepcopy(job_config)
23532369
_verify_job_config_type(job_config, google.cloud.bigquery.job.LoadJobConfig)
2370+
job_config = copy.deepcopy(job_config)
2371+
else:
2372+
job_config = job.LoadJobConfig()
2373+
2374+
# Merge this job config with a default job config
2375+
if self._default_load_job_config:
2376+
_verify_job_config_type(
2377+
self._default_load_job_config, google.cloud.bigquery.job.LoadJobConfig
2378+
)
2379+
job_config = job_config._fill_from_default(self._default_load_job_config)
23542380

23552381
load_job = job.LoadJob(job_ref, source_uris, destination, self, job_config)
23562382
load_job._begin(retry=retry, timeout=timeout)
@@ -2437,9 +2463,21 @@ def load_table_from_file(
24372463

24382464
destination = _table_arg_to_table_ref(destination, default_project=self.project)
24392465
job_ref = job._JobReference(job_id, project=project, location=location)
2466+
2467+
# Make a copy so that the job config isn't modified in-place.
24402468
if job_config:
2441-
job_config = copy.deepcopy(job_config)
24422469
_verify_job_config_type(job_config, google.cloud.bigquery.job.LoadJobConfig)
2470+
job_config = copy.deepcopy(job_config)
2471+
else:
2472+
job_config = job.LoadJobConfig()
2473+
2474+
# Merge this job config with a default job config
2475+
if self._default_load_job_config:
2476+
_verify_job_config_type(
2477+
self._default_load_job_config, google.cloud.bigquery.job.LoadJobConfig
2478+
)
2479+
job_config = job_config._fill_from_default(self._default_load_job_config)
2480+
24432481
load_job = job.LoadJob(job_ref, None, destination, self, job_config)
24442482
job_resource = load_job.to_api_repr()
24452483

@@ -2569,13 +2607,10 @@ def load_table_from_dataframe(
25692607
"""
25702608
job_id = _make_job_id(job_id, job_id_prefix)
25712609

2610+
# Make a copy so that the job config isn't modified in-place.
25722611
if job_config:
25732612
_verify_job_config_type(job_config, google.cloud.bigquery.job.LoadJobConfig)
2574-
# Make a copy so that the job config isn't modified in-place.
2575-
job_config_properties = copy.deepcopy(job_config._properties)
2576-
job_config = job.LoadJobConfig()
2577-
job_config._properties = job_config_properties
2578-
2613+
job_config = copy.deepcopy(job_config)
25792614
else:
25802615
job_config = job.LoadJobConfig()
25812616

tests/unit/job/test_base.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1104,7 +1104,7 @@ def test_ctor_with_unknown_property_raises_error(self):
11041104
config = self._make_one()
11051105
config.wrong_name = None
11061106

1107-
def test_fill_from_default(self):
1107+
def test_fill_query_job_config_from_default(self):
11081108
from google.cloud.bigquery import QueryJobConfig
11091109

11101110
job_config = QueryJobConfig()
@@ -1120,6 +1120,22 @@ def test_fill_from_default(self):
11201120
self.assertTrue(final_job_config.use_query_cache)
11211121
self.assertEqual(final_job_config.maximum_bytes_billed, 1000)
11221122

1123+
def test_fill_load_job_from_default(self):
1124+
from google.cloud.bigquery import LoadJobConfig
1125+
1126+
job_config = LoadJobConfig()
1127+
job_config.create_session = True
1128+
job_config.encoding = "UTF-8"
1129+
1130+
default_job_config = LoadJobConfig()
1131+
default_job_config.ignore_unknown_values = True
1132+
default_job_config.encoding = "ISO-8859-1"
1133+
1134+
final_job_config = job_config._fill_from_default(default_job_config)
1135+
self.assertTrue(final_job_config.create_session)
1136+
self.assertTrue(final_job_config.ignore_unknown_values)
1137+
self.assertEqual(final_job_config.encoding, "UTF-8")
1138+
11231139
def test_fill_from_default_conflict(self):
11241140
from google.cloud.bigquery import QueryJobConfig
11251141

0 commit comments

Comments
 (0)