From 32be3dc38f93493338f10878184fcd0d2ba6a729 Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Wed, 4 Nov 2020 21:49:10 +0300 Subject: [PATCH 1/9] feat: autocommit sample --- samples/samples/autocommit.py | 68 ++++++++++++++++++++++++++++++ samples/samples/test_autocommit.py | 53 +++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 samples/samples/autocommit.py create mode 100644 samples/samples/test_autocommit.py diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py new file mode 100644 index 0000000000..2ddfadbaab --- /dev/null +++ b/samples/samples/autocommit.py @@ -0,0 +1,68 @@ +# Copyright 2020 Google LLC +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +import argparse + +from google.cloud.spanner_dbapi import connect + +# [START enable_autocommit_mode] +def enable_autocommit_mode(instance_id, database_id): + """ Enables autocommit mode. """ + connection = connect(instance_id, database_id) + connection.autocommit = True + print("Autocommit mode is enabled.") + + cursor = connection.cursor() + + cursor.execute( + """CREATE TABLE Singers ( + SingerId INT64 NOT NULL, + FirstName STRING(1024), + LastName STRING(1024), + SingerInfo BYTES(MAX) + ) PRIMARY KEY (SingerId)""" + ) + + cursor.execute( + """INSERT INTO Singers (SingerId, FirstName, LastName) VALUES + (12, 'Melissa', 'Garcia'), + (13, 'Russell', 'Morales'), + (14, 'Jacqueline', 'Long'), + (15, 'Dylan', 'Shaw')""" + ) + + cursor.execute("""SELECT * FROM Singers WHERE SingerId = 13""") + + print( + u"SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*cursor.fetchone()) + ) + + connection.close() + # [END enable_autocommit_mode] + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("instance_id", help="Your Cloud Spanner instance ID.") + parser.add_argument( + "--database-id", + help="Your Cloud Spanner database ID.", + default="example_db", + ) + subparsers = parser.add_subparsers(dest="command") + subparsers.add_parser( + "enable_autocommit_mode", help=enable_autocommit_mode.__doc__ + ) + args = parser.parse_args() + if args.command == "enable_autocommit_mode": + enable_autocommit_mode(args.instance_id, args.database_id) + else: + print( + "Command {} did not match expected commands.".format(args.command) + ) diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py new file mode 100644 index 0000000000..d078fcfd4b --- /dev/null +++ b/samples/samples/test_autocommit.py @@ -0,0 +1,53 @@ +# Copyright 2020 Google LLC +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +import uuid + +from google.api_core.exceptions import DeadlineExceeded +from google.cloud import spanner +import pytest + +import autocommit + + +def unique_instance_id(): + """ Creates a unique id for the database. """ + return f"test-instance-{uuid.uuid4().hex[:10]}" + + +def unique_database_id(): + """ Creates a unique id for the database. """ + return f"test-db-{uuid.uuid4().hex[:10]}" + + +INSTANCE_ID = unique_instance_id() +DATABASE_ID = unique_database_id() + + +@pytest.fixture(scope="module") +def spanner_instance(): + spanner_client = spanner.Client() + instance = spanner_client.instance(INSTANCE_ID) + op = instance.create() + op.result(120) # block until completion + yield instance + instance.delete() + + +@pytest.fixture(scope="module") +def database(spanner_instance): + """Creates a temporary database that is removed after testing.""" + db = spanner_instance.database(DATABASE_ID) + db.create() + yield db + db.drop() + + +def test_enable_autocommit_mode(capsys): + autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) + out, _ = capsys.readouterr() + assert "Autocommit mode is enabled." in out + assert "SingerId: 13, AlbumId: Russell, AlbumTitle: Morales" in out From 22e3633b28be42f88f6b8fcc443f113a2c13e66c Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Wed, 4 Nov 2020 21:52:36 +0300 Subject: [PATCH 2/9] fix # [END ..] line --- samples/samples/autocommit.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index 2ddfadbaab..89ec17d88d 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -41,7 +41,9 @@ def enable_autocommit_mode(instance_id, database_id): ) connection.close() - # [END enable_autocommit_mode] + + +# [END enable_autocommit_mode] if __name__ == "__main__": From 0d67d2cdfa51f682cd55a54243c655b475a23211 Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Thu, 5 Nov 2020 12:16:06 +0300 Subject: [PATCH 3/9] formatting fixes --- samples/samples/autocommit.py | 9 ++++----- samples/samples/test_autocommit.py | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index 89ec17d88d..c7bad90219 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -8,9 +8,10 @@ from google.cloud.spanner_dbapi import connect -# [START enable_autocommit_mode] + def enable_autocommit_mode(instance_id, database_id): - """ Enables autocommit mode. """ + """Enables autocommit mode.""" + # [START enable_autocommit_mode] connection = connect(instance_id, database_id) connection.autocommit = True print("Autocommit mode is enabled.") @@ -41,9 +42,7 @@ def enable_autocommit_mode(instance_id, database_id): ) connection.close() - - -# [END enable_autocommit_mode] + # [END enable_autocommit_mode] if __name__ == "__main__": diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py index d078fcfd4b..96d799f7bb 100644 --- a/samples/samples/test_autocommit.py +++ b/samples/samples/test_autocommit.py @@ -15,12 +15,12 @@ def unique_instance_id(): """ Creates a unique id for the database. """ - return f"test-instance-{uuid.uuid4().hex[:10]}" + return "test-instance-{}".format(uuid.uuid4().hex[:10]) def unique_database_id(): """ Creates a unique id for the database. """ - return f"test-db-{uuid.uuid4().hex[:10]}" + return "test-db-{}".format(uuid.uuid4().hex[:10]) INSTANCE_ID = unique_instance_id() From dd7bae41900db74a6b3b6cd3dfdd449ecfdc87cf Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Thu, 5 Nov 2020 12:42:27 +0300 Subject: [PATCH 4/9] Excess whitespaces --- samples/samples/test_autocommit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py index 96d799f7bb..fa36b348fe 100644 --- a/samples/samples/test_autocommit.py +++ b/samples/samples/test_autocommit.py @@ -14,12 +14,12 @@ def unique_instance_id(): - """ Creates a unique id for the database. """ + """Creates a unique id for the database.""" return "test-instance-{}".format(uuid.uuid4().hex[:10]) def unique_database_id(): - """ Creates a unique id for the database. """ + """Creates a unique id for the database.""" return "test-db-{}".format(uuid.uuid4().hex[:10]) From fb1b546c7c8c4ce0c8b3357dae9c3e62845d7fbe Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Wed, 11 Nov 2020 17:59:04 +0300 Subject: [PATCH 5/9] review fixes --- samples/samples/__init__.py | 5 +++++ samples/samples/autocommit.py | 1 + samples/samples/test_autocommit.py | 9 ++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 samples/samples/__init__.py diff --git a/samples/samples/__init__.py b/samples/samples/__init__.py new file mode 100644 index 0000000000..6b607710ed --- /dev/null +++ b/samples/samples/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2020 Google LLC +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index c7bad90219..5a27ac6f24 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -6,6 +6,7 @@ import argparse +from google.cloud import spanner_dbapi from google.cloud.spanner_dbapi import connect diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py index fa36b348fe..b71933403f 100644 --- a/samples/samples/test_autocommit.py +++ b/samples/samples/test_autocommit.py @@ -10,7 +10,7 @@ from google.cloud import spanner import pytest -import autocommit +from . import autocommit def unique_instance_id(): @@ -30,7 +30,10 @@ def unique_database_id(): @pytest.fixture(scope="module") def spanner_instance(): spanner_client = spanner.Client() - instance = spanner_client.instance(INSTANCE_ID) + config_name = "{}/instanceConfigs/regional-us-central1".format( + spanner_client.project_name + ) + instance = spanner_client.instance(INSTANCE_ID, config_name) op = instance.create() op.result(120) # block until completion yield instance @@ -46,7 +49,7 @@ def database(spanner_instance): db.drop() -def test_enable_autocommit_mode(capsys): +def test_enable_autocommit_mode(capsys, database): autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) out, _ = capsys.readouterr() assert "Autocommit mode is enabled." in out From 4dedd72416150d3d823343a6cd17c9294941fe6e Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Thu, 12 Nov 2020 20:02:05 +0300 Subject: [PATCH 6/9] add region tag product prefix --- samples/samples/autocommit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index 5a27ac6f24..58f1273cad 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -12,7 +12,7 @@ def enable_autocommit_mode(instance_id, database_id): """Enables autocommit mode.""" - # [START enable_autocommit_mode] + # [START spanner_enable_autocommit_mode] connection = connect(instance_id, database_id) connection.autocommit = True print("Autocommit mode is enabled.") @@ -43,7 +43,7 @@ def enable_autocommit_mode(instance_id, database_id): ) connection.close() - # [END enable_autocommit_mode] + # [END spanner_enable_autocommit_mode] if __name__ == "__main__": From 596077258f9680b5569213f4883d6aee7e1367ed Mon Sep 17 00:00:00 2001 From: Dina Graves Portman Date: Tue, 17 Nov 2020 10:51:43 -0800 Subject: [PATCH 7/9] Using unique ID's for database creation --- tests/system/test_system.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/system/test_system.py b/tests/system/test_system.py index f3ee345e15..a7d4049f62 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -4,8 +4,9 @@ # license that can be found in the LICENSE file or at # https://developers.google.com/open-source/licenses/bsd -import unittest import os +import unittest +import uuid from google.api_core import exceptions @@ -104,7 +105,7 @@ def tearDownModule(): class TestTransactionsManagement(unittest.TestCase): """Transactions management support tests.""" - DATABASE_NAME = "db-api-transactions-management" + DATABASE_NAME = f"db-api-transactions-management-{uuid.uuid4().hex[:10]}" @classmethod def setUpClass(cls): From 06ff1a76ff97cbc79a41f663a90fe5d9b2c5ef1a Mon Sep 17 00:00:00 2001 From: Dina Graves Portman Date: Tue, 17 Nov 2020 11:00:16 -0800 Subject: [PATCH 8/9] Shortening DB name to 30 char --- tests/system/test_system.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/test_system.py b/tests/system/test_system.py index a7d4049f62..b7dc47a010 100644 --- a/tests/system/test_system.py +++ b/tests/system/test_system.py @@ -105,7 +105,7 @@ def tearDownModule(): class TestTransactionsManagement(unittest.TestCase): """Transactions management support tests.""" - DATABASE_NAME = f"db-api-transactions-management-{uuid.uuid4().hex[:10]}" + DATABASE_NAME = f"db-api-transactions-mgmt-{uuid.uuid4().hex[:5]}" @classmethod def setUpClass(cls): From 812c42b5a802bea762842c32e70de8abec7c2b4b Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Wed, 18 Nov 2020 00:26:40 +0300 Subject: [PATCH 9/9] small format fixes --- samples/samples/autocommit.py | 6 ++---- samples/samples/test_autocommit.py | 9 +++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index 58f1273cad..e28cd22f83 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -39,7 +39,7 @@ def enable_autocommit_mode(instance_id, database_id): cursor.execute("""SELECT * FROM Singers WHERE SingerId = 13""") print( - u"SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*cursor.fetchone()) + "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*cursor.fetchone()) ) connection.close() @@ -65,6 +65,4 @@ def enable_autocommit_mode(instance_id, database_id): if args.command == "enable_autocommit_mode": enable_autocommit_mode(args.instance_id, args.database_id) else: - print( - "Command {} did not match expected commands.".format(args.command) - ) + print(f"Command {args.command} did not match expected commands.") diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py index b71933403f..6f17e3ca92 100644 --- a/samples/samples/test_autocommit.py +++ b/samples/samples/test_autocommit.py @@ -15,12 +15,12 @@ def unique_instance_id(): """Creates a unique id for the database.""" - return "test-instance-{}".format(uuid.uuid4().hex[:10]) + return f"test-instance-{uuid.uuid4().hex[:10]}" def unique_database_id(): """Creates a unique id for the database.""" - return "test-db-{}".format(uuid.uuid4().hex[:10]) + return f"test-db-{uuid.uuid4().hex[:10]}" INSTANCE_ID = unique_instance_id() @@ -30,9 +30,10 @@ def unique_database_id(): @pytest.fixture(scope="module") def spanner_instance(): spanner_client = spanner.Client() - config_name = "{}/instanceConfigs/regional-us-central1".format( - spanner_client.project_name + config_name = ( + f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" ) + instance = spanner_client.instance(INSTANCE_ID, config_name) op = instance.create() op.result(120) # block until completion