diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index 6754931a..c5aa9b87 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -703,6 +703,10 @@ def create_connect_args(self, url): or `spanner:///projects/{project-id}/instances/{instance-id}`. For the latter, database operations will be not be possible and if required a new engine with database-id set will need to be created. + If you want to disble route to leader, pass options as following: + engine = create_engine( + "spanner+spanner:///projects/project-id/instances/instance-id/databases/database-id", + connect_args={'route_to_leader_enabled': False}) """ match = re.match( ( diff --git a/test/test_suite_13.py b/test/test_suite_13.py index b0cddf59..c1c28390 100644 --- a/test/test_suite_13.py +++ b/test/test_suite_13.py @@ -1654,6 +1654,24 @@ def test_user_agent(self): ) +class RouteToLeaderEnabledTest(SpannerSpecificTestBase): + """ + Check that SQLAlchemy dialect passes correct + route_to_leader_enabled to Client. + """ + + def test_route_to_leader(self): + engine = create_engine( + "spanner:///projects/project-id/instances/instance-id/" + + "databases/database-id", + connect_args={"route_to_leader_enabled": False}, + ) + with engine.connect() as connection: + assert ( + connection.connection.instance._client.route_to_leader_enabled is False + ) + + class ExecutionOptionsReadOnlyTest(fixtures.TestBase): """ Check that `execution_options()` method correctly diff --git a/test/test_suite_14.py b/test/test_suite_14.py index e4183821..54e373c5 100644 --- a/test/test_suite_14.py +++ b/test/test_suite_14.py @@ -1922,6 +1922,26 @@ def test_user_agent(self): ) +class RouteToLeaderEnabledTest(fixtures.TestBase): + """ + SPANNER TEST: + + Check that SQLAlchemy dialect passes correct + route_to_leader_enabled to Client. + """ + + def test_route_to_leader(self): + engine = create_engine( + "spanner:///projects/project-id/instances/instance-id/" + + "databases/database-id", + connect_args={"route_to_leader_enabled": False}, + ) + with engine.connect() as connection: + assert ( + connection.connection.instance._client.route_to_leader_enabled is False + ) + + class SimpleUpdateDeleteTest(_SimpleUpdateDeleteTest): """ SPANNER OVERRIDE: diff --git a/test/test_suite_20.py b/test/test_suite_20.py index 4902b3ab..bcf81c09 100644 --- a/test/test_suite_20.py +++ b/test/test_suite_20.py @@ -3113,6 +3113,47 @@ def test_create_engine_wo_database(self): assert connection.connection.database is None +class RouteToLeaderEnabledTest(fixtures.TestBase): + """ + SPANNER TEST: + + Check that SQLAlchemy dialect passes correct + route_to_leader_enabled to Client. + """ + + def test_route_to_leader_disabled(self): + engine = create_engine( + "spanner:///projects/project-id/instances/instance-id/" + + "databases/database-id", + connect_args={"route_to_leader_enabled": False}, + ) + with engine.connect() as connection: + assert ( + connection.connection.instance._client.route_to_leader_enabled is False + ) + + def test_route_to_leader_enabled(self): + engine = create_engine( + "spanner:///projects/project-id/instances/instance-id/" + + "databases/database-id", + connect_args={"route_to_leader_enabled": True}, + ) + with engine.connect() as connection: + assert ( + connection.connection.instance._client.route_to_leader_enabled is True + ) + + def test_route_to_leader_default(self): + engine = create_engine( + "spanner:///projects/project-id/instances/instance-id/" + + "databases/database-id" + ) + with engine.connect() as connection: + assert ( + connection.connection.instance._client.route_to_leader_enabled is True + ) + + class ReturningTest(fixtures.TestBase): def setUp(self): self._engine = create_engine(get_db_url())