Skip to content

Commit a1949ae

Browse files
fix: avoid floating point for timestamp in insert_rows (#393)
* fix: timestamp precision in insert_rows * fix: remove floating point coversion and add datetime format * fix: add formatted string in unit tests
1 parent 273d58e commit a1949ae

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

google/cloud/bigquery/_helpers.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from google.cloud._helpers import UTC
2424
from google.cloud._helpers import _date_from_iso8601_date
2525
from google.cloud._helpers import _datetime_from_microseconds
26-
from google.cloud._helpers import _microseconds_from_datetime
26+
from google.cloud._helpers import _RFC3339_MICROS
2727
from google.cloud._helpers import _RFC3339_NO_FRACTION
2828
from google.cloud._helpers import _to_bytes
2929

@@ -313,12 +313,9 @@ def _timestamp_to_json_parameter(value):
313313

314314

315315
def _timestamp_to_json_row(value):
316-
"""Coerce 'value' to an JSON-compatible representation.
317-
318-
This version returns floating-point seconds value used in row data.
319-
"""
316+
"""Coerce 'value' to an JSON-compatible representation."""
320317
if isinstance(value, datetime.datetime):
321-
value = _microseconds_from_datetime(value) * 1e-6
318+
value = value.strftime(_RFC3339_MICROS)
322319
return value
323320

324321

tests/unit/test__helpers.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -728,10 +728,14 @@ def test_w_string(self):
728728
self.assertEqual(self._call_fut(ZULU), ZULU)
729729

730730
def test_w_datetime(self):
731-
from google.cloud._helpers import _microseconds_from_datetime
732-
733731
when = datetime.datetime(2016, 12, 20, 15, 58, 27, 339328)
734-
self.assertEqual(self._call_fut(when), _microseconds_from_datetime(when) / 1e6)
732+
self.assertEqual(self._call_fut(when), "2016-12-20T15:58:27.339328Z")
733+
734+
def test_w_datetime_w_utc_zone(self):
735+
from google.cloud._helpers import UTC
736+
737+
when = datetime.datetime(2020, 11, 17, 1, 6, 52, 353795, tzinfo=UTC)
738+
self.assertEqual(self._call_fut(when), "2020-11-17T01:06:52.353795Z")
735739

736740

737741
class Test_datetime_to_json(unittest.TestCase):

tests/unit/test_client.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -5804,7 +5804,7 @@ def test_insert_rows_w_schema(self):
58045804
import datetime
58055805
from google.cloud._helpers import UTC
58065806
from google.cloud._helpers import _datetime_to_rfc3339
5807-
from google.cloud._helpers import _microseconds_from_datetime
5807+
from google.cloud._helpers import _RFC3339_MICROS
58085808
from google.cloud.bigquery.schema import SchemaField
58095809

58105810
WHEN_TS = 1437767599.006
@@ -5834,7 +5834,7 @@ def _row_data(row):
58345834
result = {"full_name": row[0], "age": str(row[1])}
58355835
joined = row[2]
58365836
if isinstance(joined, datetime.datetime):
5837-
joined = _microseconds_from_datetime(joined) * 1e-6
5837+
joined = joined.strftime(_RFC3339_MICROS)
58385838
if joined is not None:
58395839
result["joined"] = joined
58405840
return result
@@ -5864,7 +5864,7 @@ def test_insert_rows_w_list_of_dictionaries(self):
58645864
import datetime
58655865
from google.cloud._helpers import UTC
58665866
from google.cloud._helpers import _datetime_to_rfc3339
5867-
from google.cloud._helpers import _microseconds_from_datetime
5867+
from google.cloud._helpers import _RFC3339_MICROS
58685868
from google.cloud.bigquery.schema import SchemaField
58695869
from google.cloud.bigquery.table import Table
58705870

@@ -5910,7 +5910,7 @@ def _row_data(row):
59105910
row = copy.deepcopy(row)
59115911
del row["joined"]
59125912
elif isinstance(joined, datetime.datetime):
5913-
row["joined"] = _microseconds_from_datetime(joined) * 1e-6
5913+
row["joined"] = joined.strftime(_RFC3339_MICROS)
59145914
row["age"] = str(row["age"])
59155915
return row
59165916

@@ -6109,16 +6109,16 @@ def test_insert_rows_w_repeated_fields(self):
61096109
{
61106110
"score": "12",
61116111
"times": [
6112-
1543665600.0, # 2018-12-01 12:00 UTC
6113-
1543669200.0, # 2018-12-01 13:00 UTC
6112+
"2018-12-01T12:00:00.000000Z",
6113+
"2018-12-01T13:00:00.000000Z",
61146114
],
61156115
"distances": [1.25, 2.5],
61166116
},
61176117
{
61186118
"score": "13",
61196119
"times": [
6120-
1543752000.0, # 2018-12-02 12:00 UTC
6121-
1543755600.0, # 2018-12-02 13:00 UTC
6120+
"2018-12-02T12:00:00.000000Z",
6121+
"2018-12-02T13:00:00.000000Z",
61226122
],
61236123
"distances": [-1.25, -2.5],
61246124
},

0 commit comments

Comments
 (0)