As of January 1, 2020 this library no longer supports Python 2 on the latest released version. Library versions released prior to that date will continue to be available. For more information please visit Python 2 support on Google Cloud.

Source code for google.cloud.bigquery.external_config

# Copyright 2017 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Define classes that describe external data sources.

   These are used for both Table.externalDataConfiguration and
   Job.configuration.query.tableDefinitions.
"""

from __future__ import absolute_import

import base64
import copy
from typing import Any, Dict, FrozenSet, Iterable, Optional, Union

from google.cloud.bigquery._helpers import _to_bytes
from google.cloud.bigquery._helpers import _bytes_to_json
from google.cloud.bigquery._helpers import _int_or_none
from google.cloud.bigquery._helpers import _str_or_none
from google.cloud.bigquery.format_options import AvroOptions, ParquetOptions
from google.cloud.bigquery.schema import SchemaField


[docs]class ExternalSourceFormat(object): """The format for external data files. Note that the set of allowed values for external data sources is different than the set used for loading data (see :class:`~google.cloud.bigquery.job.SourceFormat`). """ CSV = "CSV" """Specifies CSV format.""" GOOGLE_SHEETS = "GOOGLE_SHEETS" """Specifies Google Sheets format.""" NEWLINE_DELIMITED_JSON = "NEWLINE_DELIMITED_JSON" """Specifies newline delimited JSON format.""" AVRO = "AVRO" """Specifies Avro format.""" DATASTORE_BACKUP = "DATASTORE_BACKUP" """Specifies datastore backup format""" ORC = "ORC" """Specifies ORC format.""" PARQUET = "PARQUET" """Specifies Parquet format.""" BIGTABLE = "BIGTABLE" """Specifies Bigtable format."""
[docs]class BigtableColumn(object): """Options for a Bigtable column.""" def __init__(self): self._properties = {} @property def encoding(self): """str: The encoding of the values when the type is not `STRING` See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumn.FIELDS.encoding """ return self._properties.get("encoding") @encoding.setter def encoding(self, value): self._properties["encoding"] = value @property def field_name(self): """str: An identifier to use if the qualifier is not a valid BigQuery field identifier See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumn.FIELDS.field_name """ return self._properties.get("fieldName") @field_name.setter def field_name(self, value): self._properties["fieldName"] = value @property def only_read_latest(self): """bool: If this is set, only the latest version of value in this column are exposed. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumn.FIELDS.only_read_latest """ return self._properties.get("onlyReadLatest") @only_read_latest.setter def only_read_latest(self, value): self._properties["onlyReadLatest"] = value @property def qualifier_encoded(self): """Union[str, bytes]: The qualifier encoded in binary. The type is ``str`` (Python 2.x) or ``bytes`` (Python 3.x). The module will handle base64 encoding for you. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumn.FIELDS.qualifier_encoded """ prop = self._properties.get("qualifierEncoded") if prop is None: return None return base64.standard_b64decode(_to_bytes(prop)) @qualifier_encoded.setter def qualifier_encoded(self, value): self._properties["qualifierEncoded"] = _bytes_to_json(value) @property def qualifier_string(self): """str: A valid UTF-8 string qualifier See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumn.FIELDS.qualifier_string """ return self._properties.get("qualifierString") @qualifier_string.setter def qualifier_string(self, value): self._properties["qualifierString"] = value @property def type_(self): """str: The type to convert the value in cells of this column. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumn.FIELDS.type """ return self._properties.get("type") @type_.setter def type_(self, value): self._properties["type"] = value
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ return copy.deepcopy(self._properties)
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "BigtableColumn": """Factory: construct a :class:`~.external_config.BigtableColumn` instance given its API representation. Args: resource (Dict[str, Any]): Definition of a :class:`~.external_config.BigtableColumn` instance in the same representation as is returned from the API. Returns: external_config.BigtableColumn: Configuration parsed from ``resource``. """ config = cls() config._properties = copy.deepcopy(resource) return config
[docs]class BigtableColumnFamily(object): """Options for a Bigtable column family.""" def __init__(self): self._properties = {} @property def encoding(self): """str: The encoding of the values when the type is not `STRING` See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumnFamily.FIELDS.encoding """ return self._properties.get("encoding") @encoding.setter def encoding(self, value): self._properties["encoding"] = value @property def family_id(self): """str: Identifier of the column family. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumnFamily.FIELDS.family_id """ return self._properties.get("familyId") @family_id.setter def family_id(self, value): self._properties["familyId"] = value @property def only_read_latest(self): """bool: If this is set only the latest version of value are exposed for all columns in this column family. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumnFamily.FIELDS.only_read_latest """ return self._properties.get("onlyReadLatest") @only_read_latest.setter def only_read_latest(self, value): self._properties["onlyReadLatest"] = value @property def type_(self): """str: The type to convert the value in cells of this column family. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumnFamily.FIELDS.type """ return self._properties.get("type") @type_.setter def type_(self, value): self._properties["type"] = value @property def columns(self): """List[BigtableColumn]: Lists of columns that should be exposed as individual fields. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableColumnFamily.FIELDS.columns """ prop = self._properties.get("columns", []) return [BigtableColumn.from_api_repr(col) for col in prop] @columns.setter def columns(self, value): self._properties["columns"] = [col.to_api_repr() for col in value]
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ return copy.deepcopy(self._properties)
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "BigtableColumnFamily": """Factory: construct a :class:`~.external_config.BigtableColumnFamily` instance given its API representation. Args: resource (Dict[str, Any]): Definition of a :class:`~.external_config.BigtableColumnFamily` instance in the same representation as is returned from the API. Returns: :class:`~.external_config.BigtableColumnFamily`: Configuration parsed from ``resource``. """ config = cls() config._properties = copy.deepcopy(resource) return config
[docs]class BigtableOptions(object): """Options that describe how to treat Bigtable tables as BigQuery tables.""" _SOURCE_FORMAT = "BIGTABLE" _RESOURCE_NAME = "bigtableOptions" def __init__(self): self._properties = {} @property def ignore_unspecified_column_families(self): """bool: If :data:`True`, ignore columns not specified in :attr:`column_families` list. Defaults to :data:`False`. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableOptions.FIELDS.ignore_unspecified_column_families """ return self._properties.get("ignoreUnspecifiedColumnFamilies") @ignore_unspecified_column_families.setter def ignore_unspecified_column_families(self, value): self._properties["ignoreUnspecifiedColumnFamilies"] = value @property def read_rowkey_as_string(self): """bool: If :data:`True`, rowkey column families will be read and converted to string. Defaults to :data:`False`. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableOptions.FIELDS.read_rowkey_as_string """ return self._properties.get("readRowkeyAsString") @read_rowkey_as_string.setter def read_rowkey_as_string(self, value): self._properties["readRowkeyAsString"] = value @property def column_families(self): """List[:class:`~.external_config.BigtableColumnFamily`]: List of column families to expose in the table schema along with their types. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#BigtableOptions.FIELDS.column_families """ prop = self._properties.get("columnFamilies", []) return [BigtableColumnFamily.from_api_repr(cf) for cf in prop] @column_families.setter def column_families(self, value): self._properties["columnFamilies"] = [cf.to_api_repr() for cf in value]
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ return copy.deepcopy(self._properties)
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "BigtableOptions": """Factory: construct a :class:`~.external_config.BigtableOptions` instance given its API representation. Args: resource (Dict[str, Any]): Definition of a :class:`~.external_config.BigtableOptions` instance in the same representation as is returned from the API. Returns: BigtableOptions: Configuration parsed from ``resource``. """ config = cls() config._properties = copy.deepcopy(resource) return config
[docs]class CSVOptions(object): """Options that describe how to treat CSV files as BigQuery tables.""" _SOURCE_FORMAT = "CSV" _RESOURCE_NAME = "csvOptions" def __init__(self): self._properties = {} @property def allow_jagged_rows(self): """bool: If :data:`True`, BigQuery treats missing trailing columns as null values. Defaults to :data:`False`. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.allow_jagged_rows """ return self._properties.get("allowJaggedRows") @allow_jagged_rows.setter def allow_jagged_rows(self, value): self._properties["allowJaggedRows"] = value @property def allow_quoted_newlines(self): """bool: If :data:`True`, quoted data sections that contain newline characters in a CSV file are allowed. Defaults to :data:`False`. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.allow_quoted_newlines """ return self._properties.get("allowQuotedNewlines") @allow_quoted_newlines.setter def allow_quoted_newlines(self, value): self._properties["allowQuotedNewlines"] = value @property def encoding(self): """str: The character encoding of the data. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.encoding """ return self._properties.get("encoding") @encoding.setter def encoding(self, value): self._properties["encoding"] = value @property def preserve_ascii_control_characters(self): """bool: Indicates if the embedded ASCII control characters (the first 32 characters in the ASCII-table, from '\x00' to '\x1F') are preserved. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.preserve_ascii_control_characters """ return self._properties.get("preserveAsciiControlCharacters") @preserve_ascii_control_characters.setter def preserve_ascii_control_characters(self, value): self._properties["preserveAsciiControlCharacters"] = value @property def field_delimiter(self): """str: The separator for fields in a CSV file. Defaults to comma (','). See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.field_delimiter """ return self._properties.get("fieldDelimiter") @field_delimiter.setter def field_delimiter(self, value): self._properties["fieldDelimiter"] = value @property def quote_character(self): """str: The value that is used to quote data sections in a CSV file. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.quote """ return self._properties.get("quote") @quote_character.setter def quote_character(self, value): self._properties["quote"] = value @property def skip_leading_rows(self): """int: The number of rows at the top of a CSV file. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#CsvOptions.FIELDS.skip_leading_rows """ return _int_or_none(self._properties.get("skipLeadingRows")) @skip_leading_rows.setter def skip_leading_rows(self, value): self._properties["skipLeadingRows"] = str(value)
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ return copy.deepcopy(self._properties)
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "CSVOptions": """Factory: construct a :class:`~.external_config.CSVOptions` instance given its API representation. Args: resource (Dict[str, Any]): Definition of a :class:`~.external_config.CSVOptions` instance in the same representation as is returned from the API. Returns: CSVOptions: Configuration parsed from ``resource``. """ config = cls() config._properties = copy.deepcopy(resource) return config
[docs]class GoogleSheetsOptions(object): """Options that describe how to treat Google Sheets as BigQuery tables.""" _SOURCE_FORMAT = "GOOGLE_SHEETS" _RESOURCE_NAME = "googleSheetsOptions" def __init__(self): self._properties = {} @property def skip_leading_rows(self): """int: The number of rows at the top of a sheet that BigQuery will skip when reading the data. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#GoogleSheetsOptions.FIELDS.skip_leading_rows """ return _int_or_none(self._properties.get("skipLeadingRows")) @skip_leading_rows.setter def skip_leading_rows(self, value): self._properties["skipLeadingRows"] = str(value) @property def range(self): """str: The range of a sheet that BigQuery will query from. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#GoogleSheetsOptions.FIELDS.range """ return _str_or_none(self._properties.get("range")) @range.setter def range(self, value): self._properties["range"] = value
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ return copy.deepcopy(self._properties)
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "GoogleSheetsOptions": """Factory: construct a :class:`~.external_config.GoogleSheetsOptions` instance given its API representation. Args: resource (Dict[str, Any]): Definition of a :class:`~.external_config.GoogleSheetsOptions` instance in the same representation as is returned from the API. Returns: GoogleSheetsOptions: Configuration parsed from ``resource``. """ config = cls() config._properties = copy.deepcopy(resource) return config
_OPTION_CLASSES = ( AvroOptions, BigtableOptions, CSVOptions, GoogleSheetsOptions, ParquetOptions, ) OptionsType = Union[ AvroOptions, BigtableOptions, CSVOptions, GoogleSheetsOptions, ParquetOptions, ]
[docs]class HivePartitioningOptions(object): """[Beta] Options that configure hive partitioning. .. note:: **Experimental**. This feature is experimental and might change or have limited support. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#HivePartitioningOptions """ def __init__(self) -> None: self._properties: Dict[str, Any] = {} @property def mode(self): """Optional[str]: When set, what mode of hive partitioning to use when reading data. Two modes are supported: "AUTO" and "STRINGS". See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#HivePartitioningOptions.FIELDS.mode """ return self._properties.get("mode") @mode.setter def mode(self, value): self._properties["mode"] = value @property def source_uri_prefix(self): """Optional[str]: When hive partition detection is requested, a common prefix for all source URIs is required. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#HivePartitioningOptions.FIELDS.source_uri_prefix """ return self._properties.get("sourceUriPrefix") @source_uri_prefix.setter def source_uri_prefix(self, value): self._properties["sourceUriPrefix"] = value @property def require_partition_filter(self): """Optional[bool]: If set to true, queries over the partitioned table require a partition filter that can be used for partition elimination to be specified. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#HivePartitioningOptions.FIELDS.mode """ return self._properties.get("requirePartitionFilter") @require_partition_filter.setter def require_partition_filter(self, value): self._properties["requirePartitionFilter"] = value
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ return copy.deepcopy(self._properties)
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "HivePartitioningOptions": """Factory: construct a :class:`~.external_config.HivePartitioningOptions` instance given its API representation. Args: resource (Dict[str, Any]): Definition of a :class:`~.external_config.HivePartitioningOptions` instance in the same representation as is returned from the API. Returns: HivePartitioningOptions: Configuration parsed from ``resource``. """ config = cls() config._properties = copy.deepcopy(resource) return config
[docs]class ExternalConfig(object): """Description of an external data source. Args: source_format (ExternalSourceFormat): See :attr:`source_format`. """ def __init__(self, source_format) -> None: self._properties = {"sourceFormat": source_format} @property def source_format(self): """:class:`~.external_config.ExternalSourceFormat`: Format of external source. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.source_format """ return self._properties["sourceFormat"] @property def options(self) -> Optional[OptionsType]: """Source-specific options.""" for optcls in _OPTION_CLASSES: # The code below is too much magic for mypy to handle. if self.source_format == optcls._SOURCE_FORMAT: # type: ignore options: OptionsType = optcls() # type: ignore options._properties = self._properties.setdefault( optcls._RESOURCE_NAME, {} # type: ignore ) return options # No matching source format found. return None @property def autodetect(self): """bool: If :data:`True`, try to detect schema and format options automatically. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.autodetect """ return self._properties.get("autodetect") @autodetect.setter def autodetect(self, value): self._properties["autodetect"] = value @property def compression(self): """str: The compression type of the data source. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.compression """ return self._properties.get("compression") @compression.setter def compression(self, value): self._properties["compression"] = value @property def decimal_target_types(self) -> Optional[FrozenSet[str]]: """Possible SQL data types to which the source decimal values are converted. See: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.decimal_target_types .. versionadded:: 2.21.0 """ prop = self._properties.get("decimalTargetTypes") if prop is not None: prop = frozenset(prop) return prop @decimal_target_types.setter def decimal_target_types(self, value: Optional[Iterable[str]]): if value is not None: self._properties["decimalTargetTypes"] = list(value) else: if "decimalTargetTypes" in self._properties: del self._properties["decimalTargetTypes"] @property def hive_partitioning(self): """Optional[:class:`~.external_config.HivePartitioningOptions`]: [Beta] When set, \ it configures hive partitioning support. .. note:: **Experimental**. This feature is experimental and might change or have limited support. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.hive_partitioning_options """ prop = self._properties.get("hivePartitioningOptions") if prop is None: return None return HivePartitioningOptions.from_api_repr(prop) @hive_partitioning.setter def hive_partitioning(self, value): prop = value.to_api_repr() if value is not None else None self._properties["hivePartitioningOptions"] = prop @property def reference_file_schema_uri(self): """Optional[str]: When creating an external table, the user can provide a reference file with the table schema. This is enabled for the following formats: AVRO, PARQUET, ORC """ return self._properties.get("referenceFileSchemaUri") @reference_file_schema_uri.setter def reference_file_schema_uri(self, value): self._properties["referenceFileSchemaUri"] = value @property def ignore_unknown_values(self): """bool: If :data:`True`, extra values that are not represented in the table schema are ignored. Defaults to :data:`False`. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.ignore_unknown_values """ return self._properties.get("ignoreUnknownValues") @ignore_unknown_values.setter def ignore_unknown_values(self, value): self._properties["ignoreUnknownValues"] = value @property def max_bad_records(self): """int: The maximum number of bad records that BigQuery can ignore when reading data. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.max_bad_records """ return self._properties.get("maxBadRecords") @max_bad_records.setter def max_bad_records(self, value): self._properties["maxBadRecords"] = value @property def source_uris(self): """List[str]: URIs that point to your data in Google Cloud. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.source_uris """ return self._properties.get("sourceUris", []) @source_uris.setter def source_uris(self, value): self._properties["sourceUris"] = value @property def schema(self): """List[:class:`~google.cloud.bigquery.schema.SchemaField`]: The schema for the data. See https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.schema """ prop = self._properties.get("schema", {}) return [SchemaField.from_api_repr(field) for field in prop.get("fields", [])] @schema.setter def schema(self, value): prop = value if value is not None: prop = {"fields": [field.to_api_repr() for field in value]} self._properties["schema"] = prop @property def connection_id(self): """Optional[str]: [Experimental] ID of a BigQuery Connection API resource. .. WARNING:: This feature is experimental. Pre-GA features may have limited support, and changes to pre-GA features may not be compatible with other pre-GA versions. """ return self._properties.get("connectionId") @connection_id.setter def connection_id(self, value): self._properties["connectionId"] = value @property def avro_options(self) -> Optional[AvroOptions]: """Additional properties to set if ``sourceFormat`` is set to AVRO. See: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.avro_options """ if self.source_format == ExternalSourceFormat.AVRO: self._properties.setdefault(AvroOptions._RESOURCE_NAME, {}) resource = self._properties.get(AvroOptions._RESOURCE_NAME) if resource is None: return None options = AvroOptions() options._properties = resource return options @avro_options.setter def avro_options(self, value): if self.source_format != ExternalSourceFormat.AVRO: msg = f"Cannot set Avro options, source format is {self.source_format}" raise TypeError(msg) self._properties[AvroOptions._RESOURCE_NAME] = value._properties @property def bigtable_options(self) -> Optional[BigtableOptions]: """Additional properties to set if ``sourceFormat`` is set to BIGTABLE. See: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.bigtable_options """ if self.source_format == ExternalSourceFormat.BIGTABLE: self._properties.setdefault(BigtableOptions._RESOURCE_NAME, {}) resource = self._properties.get(BigtableOptions._RESOURCE_NAME) if resource is None: return None options = BigtableOptions() options._properties = resource return options @bigtable_options.setter def bigtable_options(self, value): if self.source_format != ExternalSourceFormat.BIGTABLE: msg = f"Cannot set Bigtable options, source format is {self.source_format}" raise TypeError(msg) self._properties[BigtableOptions._RESOURCE_NAME] = value._properties @property def csv_options(self) -> Optional[CSVOptions]: """Additional properties to set if ``sourceFormat`` is set to CSV. See: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.csv_options """ if self.source_format == ExternalSourceFormat.CSV: self._properties.setdefault(CSVOptions._RESOURCE_NAME, {}) resource = self._properties.get(CSVOptions._RESOURCE_NAME) if resource is None: return None options = CSVOptions() options._properties = resource return options @csv_options.setter def csv_options(self, value): if self.source_format != ExternalSourceFormat.CSV: msg = f"Cannot set CSV options, source format is {self.source_format}" raise TypeError(msg) self._properties[CSVOptions._RESOURCE_NAME] = value._properties @property def google_sheets_options(self) -> Optional[GoogleSheetsOptions]: """Additional properties to set if ``sourceFormat`` is set to GOOGLE_SHEETS. See: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.google_sheets_options """ if self.source_format == ExternalSourceFormat.GOOGLE_SHEETS: self._properties.setdefault(GoogleSheetsOptions._RESOURCE_NAME, {}) resource = self._properties.get(GoogleSheetsOptions._RESOURCE_NAME) if resource is None: return None options = GoogleSheetsOptions() options._properties = resource return options @google_sheets_options.setter def google_sheets_options(self, value): if self.source_format != ExternalSourceFormat.GOOGLE_SHEETS: msg = f"Cannot set Google Sheets options, source format is {self.source_format}" raise TypeError(msg) self._properties[GoogleSheetsOptions._RESOURCE_NAME] = value._properties @property def parquet_options(self) -> Optional[ParquetOptions]: """Additional properties to set if ``sourceFormat`` is set to PARQUET. See: https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#ExternalDataConfiguration.FIELDS.parquet_options """ if self.source_format == ExternalSourceFormat.PARQUET: self._properties.setdefault(ParquetOptions._RESOURCE_NAME, {}) resource = self._properties.get(ParquetOptions._RESOURCE_NAME) if resource is None: return None options = ParquetOptions() options._properties = resource return options @parquet_options.setter def parquet_options(self, value): if self.source_format != ExternalSourceFormat.PARQUET: msg = f"Cannot set Parquet options, source format is {self.source_format}" raise TypeError(msg) self._properties[ParquetOptions._RESOURCE_NAME] = value._properties
[docs] def to_api_repr(self) -> dict: """Build an API representation of this object. Returns: Dict[str, Any]: A dictionary in the format used by the BigQuery API. """ config = copy.deepcopy(self._properties) return config
[docs] @classmethod def from_api_repr(cls, resource: dict) -> "ExternalConfig": """Factory: construct an :class:`~.external_config.ExternalConfig` instance given its API representation. Args: resource (Dict[str, Any]): Definition of an :class:`~.external_config.ExternalConfig` instance in the same representation as is returned from the API. Returns: ExternalConfig: Configuration parsed from ``resource``. """ config = cls(resource["sourceFormat"]) config._properties = copy.deepcopy(resource) return config