Skip to content
This repository was archived by the owner on Mar 31, 2026. It is now read-only.

Commit 48ac924

Browse files
authored
chore: add samples for JSON (#526)
1 parent 6cd4561 commit 48ac924

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed

samples/samples/snippets.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import base64
2525
import datetime
2626
import decimal
27+
import json
2728
import logging
2829
import time
2930

@@ -1012,6 +1013,81 @@ def update_data_with_numeric(instance_id, database_id):
10121013
# [END spanner_update_data_with_numeric_column]
10131014

10141015

1016+
# [START spanner_add_json_column]
1017+
def add_json_column(instance_id, database_id):
1018+
""" Adds a new JSON column to the Venues table in the example database.
1019+
"""
1020+
spanner_client = spanner.Client()
1021+
instance = spanner_client.instance(instance_id)
1022+
1023+
database = instance.database(database_id)
1024+
1025+
operation = database.update_ddl(["ALTER TABLE Venues ADD COLUMN VenueDetails JSON"])
1026+
1027+
print("Waiting for operation to complete...")
1028+
operation.result(OPERATION_TIMEOUT_SECONDS)
1029+
1030+
print(
1031+
'Altered table "Venues" on database {} on instance {}.'.format(
1032+
database_id, instance_id
1033+
)
1034+
)
1035+
1036+
1037+
# [END spanner_add_json_column]
1038+
1039+
1040+
# [START spanner_update_data_with_json_column]
1041+
def update_data_with_json(instance_id, database_id):
1042+
"""Updates Venues tables in the database with the JSON
1043+
column.
1044+
1045+
This updates the `VenueDetails` column which must be created before
1046+
running this sample. You can add the column by running the
1047+
`add_json_column` sample or by running this DDL statement
1048+
against your database:
1049+
1050+
ALTER TABLE Venues ADD COLUMN VenueDetails JSON
1051+
"""
1052+
spanner_client = spanner.Client()
1053+
instance = spanner_client.instance(instance_id)
1054+
1055+
database = instance.database(database_id)
1056+
1057+
with database.batch() as batch:
1058+
batch.update(
1059+
table="Venues",
1060+
columns=("VenueId", "VenueDetails"),
1061+
values=[
1062+
(
1063+
4,
1064+
json.dumps(
1065+
[
1066+
{"name": "room 1", "open": True},
1067+
{"name": "room 2", "open": False},
1068+
]
1069+
),
1070+
),
1071+
(19, json.dumps({"rating": 9, "open": True})),
1072+
(
1073+
42,
1074+
json.dumps(
1075+
{
1076+
"name": None,
1077+
"open": {"Monday": True, "Tuesday": False},
1078+
"tags": ["large", "airy"],
1079+
}
1080+
),
1081+
),
1082+
],
1083+
)
1084+
1085+
print("Updated data.")
1086+
1087+
1088+
# [END spanner_update_data_with_json_column]
1089+
1090+
10151091
# [START spanner_write_data_for_struct_queries]
10161092
def write_struct_data(instance_id, database_id):
10171093
"""Inserts sample data that can be used to test STRUCT parameters
@@ -1860,6 +1936,34 @@ def query_data_with_numeric_parameter(instance_id, database_id):
18601936
# [END spanner_query_with_numeric_parameter]
18611937

18621938

1939+
def query_data_with_json_parameter(instance_id, database_id):
1940+
"""Queries sample data using SQL with a JSON parameter. """
1941+
# [START spanner_query_with_json_parameter]
1942+
# instance_id = "your-spanner-instance"
1943+
# database_id = "your-spanner-db-id"
1944+
spanner_client = spanner.Client()
1945+
instance = spanner_client.instance(instance_id)
1946+
database = instance.database(database_id)
1947+
1948+
example_json = json.dumps({"rating": 9})
1949+
param = {"details": example_json}
1950+
param_type = {"details": param_types.JSON}
1951+
1952+
with database.snapshot() as snapshot:
1953+
results = snapshot.execute_sql(
1954+
"SELECT VenueId, VenueDetails "
1955+
"FROM Venues "
1956+
"WHERE JSON_VALUE(VenueDetails, '$.rating') = "
1957+
"JSON_VALUE(@details, '$.rating')",
1958+
params=param,
1959+
param_types=param_type,
1960+
)
1961+
1962+
for row in results:
1963+
print(u"VenueId: {}, VenueDetails: {}".format(*row))
1964+
# [END spanner_query_with_json_parameter]
1965+
1966+
18631967
def query_data_with_timestamp_parameter(instance_id, database_id):
18641968
"""Queries sample data using SQL with a TIMESTAMP parameter. """
18651969
# [START spanner_query_with_timestamp_parameter]

samples/samples/snippets_test.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,29 @@ def test_query_data_with_numeric_parameter(capsys, instance_id, sample_database)
562562
assert "VenueId: 4, Revenue: 35000" in out
563563

564564

565+
@pytest.mark.dependency(
566+
name="add_json_column", depends=["create_table_with_datatypes"],
567+
)
568+
def test_add_json_column(capsys, instance_id, sample_database):
569+
snippets.add_json_column(instance_id, sample_database.database_id)
570+
out, _ = capsys.readouterr()
571+
assert 'Altered table "Venues" on database ' in out
572+
573+
574+
@pytest.mark.dependency(depends=["add_json_column", "insert_datatypes_data"])
575+
def test_update_data_with_json(capsys, instance_id, sample_database):
576+
snippets.update_data_with_json(instance_id, sample_database.database_id)
577+
out, _ = capsys.readouterr()
578+
assert "Updated data" in out
579+
580+
581+
@pytest.mark.dependency(depends=["add_json_column"])
582+
def test_query_data_with_json_parameter(capsys, instance_id, sample_database):
583+
snippets.query_data_with_json_parameter(instance_id, sample_database.database_id)
584+
out, _ = capsys.readouterr()
585+
assert "VenueId: 19, VenueDetails: {\"open\":true,\"rating\":9}" in out
586+
587+
565588
@pytest.mark.dependency(depends=["insert_datatypes_data"])
566589
def test_query_data_with_timestamp_parameter(capsys, instance_id, sample_database):
567590
snippets.query_data_with_timestamp_parameter(instance_id, sample_database.database_id)

0 commit comments

Comments
 (0)