From d415fcd8b74002d7372e854ca276df660519ac31 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:35:23 +0300 Subject: [PATCH 01/10] feat: drop read_only on a connection returned back to a pool --- .../sqlalchemy_spanner/sqlalchemy_spanner.py | 3 ++ test/test_suite.py | 35 +++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index fa704c95..3532ff86 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -51,6 +51,9 @@ def reset_connection(dbapi_conn, connection_record): if getattr(dbapi_conn.connection, "staleness", None) is not None: dbapi_conn.connection.staleness = None + if getattr(dbapi_conn.connection, "read_only", None) is not None: + dbapi_conn.connection.read_only = False + # register a method to get a single value of a JSON object OPERATORS[json_getitem_op] = operator_lookup["json_getitem_op"] diff --git a/test/test_suite.py b/test/test_suite.py index 735c0be8..67ec27c2 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1579,14 +1579,13 @@ def test_user_agent(self): ) -class ExecutionOptionsTest(fixtures.TestBase, unittest.TestCase): +class ExecutionOptionsReadOnlyTest(fixtures.TestBase): """ Check that `execution_options()` method correctly sets parameters on the underlying DB API connection. """ - @classmethod - def setUpClass(cls): + def setUp(cls): cls._engine = create_engine(get_db_url(), pool_size=1) cls._metadata = MetaData(bind=cls._engine) @@ -1604,6 +1603,29 @@ def test_read_only(self): connection.execute(select(["*"], from_obj=self._table)).fetchall() assert connection.connection.read_only is True + with self._engine.connect() as connection: + assert connection.connection.read_only is False + + +class ExecutionOptionsStalenessTest(fixtures.TestBase): + """ + Check that `execution_options()` method correctly + sets parameters on the underlying DB API connection. + """ + + def setUp(cls): + cls._engine = create_engine(get_db_url(), pool_size=1) + cls._metadata = MetaData(bind=cls._engine) + + cls._table = Table( + "execution_options", + cls._metadata, + Column("opt_id", Integer, primary_key=True), + Column("opt_name", String(16), nullable=False), + ) + + cls._metadata.create_all(cls._engine) + def test_staleness(self): with self._engine.connect().execution_options( read_only=True, staleness={"exact_staleness": datetime.timedelta(seconds=5)} @@ -1614,10 +1636,11 @@ def test_staleness(self): } with self._engine.connect() as connection: - assert connection.connection.staleness is None + assert connection.connection.staleness == {} - with self._engine.connect() as connection: - del connection.staleness + engine = create_engine("sqlite:///database") + with engine.connect() as connection: + pass class LimitOffsetTest(fixtures.TestBase): From 9c17b7c4eb3dc6475f08e88708eee995ba985085 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:37:28 +0300 Subject: [PATCH 02/10] lint fix --- test/test_suite.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_suite.py b/test/test_suite.py index 67ec27c2..057ae77d 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -21,7 +21,6 @@ import pkg_resources import pytest import random -import unittest from unittest import mock import sqlalchemy From 6a8d2ad0d586defc7206544a27acba066e6a8058 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:44:14 +0300 Subject: [PATCH 03/10] fix test --- test/test_suite.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index 057ae77d..d693245c 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1586,16 +1586,16 @@ class ExecutionOptionsReadOnlyTest(fixtures.TestBase): def setUp(cls): cls._engine = create_engine(get_db_url(), pool_size=1) - cls._metadata = MetaData(bind=cls._engine) + metadata = MetaData(bind=cls._engine) cls._table = Table( "execution_options", - cls._metadata, + metadata, Column("opt_id", Integer, primary_key=True), Column("opt_name", String(16), nullable=False), ) - cls._metadata.create_all(cls._engine) + metadata.create_all(cls._engine) def test_read_only(self): with self._engine.connect().execution_options(read_only=True) as connection: @@ -1614,16 +1614,16 @@ class ExecutionOptionsStalenessTest(fixtures.TestBase): def setUp(cls): cls._engine = create_engine(get_db_url(), pool_size=1) - cls._metadata = MetaData(bind=cls._engine) + metadata = MetaData(bind=cls._engine) cls._table = Table( - "execution_options", - cls._metadata, + "execution_options2", + metadata, Column("opt_id", Integer, primary_key=True), Column("opt_name", String(16), nullable=False), ) - cls._metadata.create_all(cls._engine) + metadata.create_all(cls._engine) def test_staleness(self): with self._engine.connect().execution_options( From 7b87ae1b2afcb6fde3b5a0a57c445e60b7f77a82 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:47:03 +0300 Subject: [PATCH 04/10] fix test --- test/test_suite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_suite.py b/test/test_suite.py index d693245c..86f2decb 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1617,7 +1617,7 @@ def setUp(cls): metadata = MetaData(bind=cls._engine) cls._table = Table( - "execution_options2", + "execution_options_tab", metadata, Column("opt_id", Integer, primary_key=True), Column("opt_name", String(16), nullable=False), From ce7b177ce23652c0aaacb0ae4424c3b1596f03a1 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:50:18 +0300 Subject: [PATCH 05/10] fix test --- test/test_suite.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index 86f2decb..d2eebe3f 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1584,18 +1584,18 @@ class ExecutionOptionsReadOnlyTest(fixtures.TestBase): sets parameters on the underlying DB API connection. """ - def setUp(cls): - cls._engine = create_engine(get_db_url(), pool_size=1) - metadata = MetaData(bind=cls._engine) + def setUp(self): + self._engine = create_engine(get_db_url(), pool_size=1) + metadata = MetaData(bind=self._engine) - cls._table = Table( + self._table = Table( "execution_options", metadata, Column("opt_id", Integer, primary_key=True), Column("opt_name", String(16), nullable=False), ) - metadata.create_all(cls._engine) + metadata.create_all(self._engine) def test_read_only(self): with self._engine.connect().execution_options(read_only=True) as connection: @@ -1612,18 +1612,17 @@ class ExecutionOptionsStalenessTest(fixtures.TestBase): sets parameters on the underlying DB API connection. """ - def setUp(cls): - cls._engine = create_engine(get_db_url(), pool_size=1) - metadata = MetaData(bind=cls._engine) + def setUp(self): + self._engine = create_engine(get_db_url(), pool_size=1) + metadata = MetaData(bind=self._engine) - cls._table = Table( + self._table = Table( "execution_options_tab", metadata, Column("opt_id", Integer, primary_key=True), - Column("opt_name", String(16), nullable=False), ) - metadata.create_all(cls._engine) + metadata.create_all(self._engine) def test_staleness(self): with self._engine.connect().execution_options( From c278a43a629bd88c8e568a361add85c0d9b31f07 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:55:21 +0300 Subject: [PATCH 06/10] fix test --- test/test_suite.py | 53 +++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index d2eebe3f..d45f633b 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1606,6 +1606,31 @@ def test_read_only(self): assert connection.connection.read_only is False +class LimitOffsetTest(fixtures.TestBase): + """ + Check that SQL with an offset and no limit is being generated correctly. + """ + + def setUp(self): + self._engine = create_engine(get_db_url(), pool_size=1) + self._metadata = MetaData(bind=self._engine) + + self._table = Table( + "users", + self._metadata, + Column("user_id", Integer, primary_key=True), + Column("user_name", String(16), nullable=False), + ) + + self._metadata.create_all(self._engine) + + def test_offset_only(self): + for offset in [1, 7, 10, 100, 1000, 10000]: + + with self._engine.connect().execution_options(read_only=True) as connection: + list(connection.execute(self._table.select().offset(offset)).fetchall()) + + class ExecutionOptionsStalenessTest(fixtures.TestBase): """ Check that `execution_options()` method correctly @@ -1617,9 +1642,10 @@ def setUp(self): metadata = MetaData(bind=self._engine) self._table = Table( - "execution_options_tab", + "options_tab", metadata, Column("opt_id", Integer, primary_key=True), + Column("opt_name", String(16), nullable=False), ) metadata.create_all(self._engine) @@ -1641,31 +1667,6 @@ def test_staleness(self): pass -class LimitOffsetTest(fixtures.TestBase): - """ - Check that SQL with an offset and no limit is being generated correctly. - """ - - def setUp(self): - self._engine = create_engine(get_db_url(), pool_size=1) - self._metadata = MetaData(bind=self._engine) - - self._table = Table( - "users", - self._metadata, - Column("user_id", Integer, primary_key=True), - Column("user_name", String(16), nullable=False), - ) - - self._metadata.create_all(self._engine) - - def test_offset_only(self): - for offset in [1, 7, 10, 100, 1000, 10000]: - - with self._engine.connect().execution_options(read_only=True) as connection: - list(connection.execute(self._table.select().offset(offset)).fetchall()) - - class TemporaryTableTest(fixtures.TestBase): """ Check that temporary tables raise an error on creation. From 9ceb9354eadef54a69421ffc1bb4b767e80a81ff Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 11:57:43 +0300 Subject: [PATCH 07/10] fix test --- test/test_suite.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index d45f633b..a0cd0832 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1639,16 +1639,16 @@ class ExecutionOptionsStalenessTest(fixtures.TestBase): def setUp(self): self._engine = create_engine(get_db_url(), pool_size=1) - metadata = MetaData(bind=self._engine) + self._metadata = MetaData(bind=self._engine) self._table = Table( - "options_tab", - metadata, - Column("opt_id", Integer, primary_key=True), - Column("opt_name", String(16), nullable=False), + "users", + self._metadata, + Column("user_id", Integer, primary_key=True), + Column("user_name", String(16), nullable=False), ) - metadata.create_all(self._engine) + self._metadata.create_all(self._engine) def test_staleness(self): with self._engine.connect().execution_options( From e4d7af78ea17e9eff73c919f0e3801a607829fff Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 12:00:34 +0300 Subject: [PATCH 08/10] fix test --- test/test_suite.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index a0cd0832..8f19e8ca 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1639,16 +1639,16 @@ class ExecutionOptionsStalenessTest(fixtures.TestBase): def setUp(self): self._engine = create_engine(get_db_url(), pool_size=1) - self._metadata = MetaData(bind=self._engine) + metadata = MetaData(bind=self._engine) self._table = Table( - "users", - self._metadata, - Column("user_id", Integer, primary_key=True), - Column("user_name", String(16), nullable=False), + "execution_options", + metadata, + Column("opt_id", Integer, primary_key=True), + Column("opt_name", String(16), nullable=False), ) - self._metadata.create_all(self._engine) + metadata.create_all(self._engine) def test_staleness(self): with self._engine.connect().execution_options( From 80b7aa923b0004218d115f1d845ee7d38f039ae9 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 12:03:53 +0300 Subject: [PATCH 09/10] fix test --- test/test_suite.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index 8f19e8ca..b85cbc04 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -1649,14 +1649,17 @@ def setUp(self): ) metadata.create_all(self._engine) + import time + + time.sleep(1) def test_staleness(self): with self._engine.connect().execution_options( - read_only=True, staleness={"exact_staleness": datetime.timedelta(seconds=5)} + read_only=True, staleness={"exact_staleness": datetime.timedelta(seconds=1)} ) as connection: connection.execute(select(["*"], from_obj=self._table)).fetchall() assert connection.connection.staleness == { - "exact_staleness": datetime.timedelta(seconds=5) + "exact_staleness": datetime.timedelta(seconds=1) } with self._engine.connect() as connection: From acbea8d6a2e792bc275f824c77148b6c5c47482c Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Mon, 10 Jan 2022 12:05:39 +0300 Subject: [PATCH 10/10] fix test --- test/test_suite.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/test_suite.py b/test/test_suite.py index b85cbc04..b53045ac 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -21,6 +21,7 @@ import pkg_resources import pytest import random +import time from unittest import mock import sqlalchemy @@ -1649,8 +1650,6 @@ def setUp(self): ) metadata.create_all(self._engine) - import time - time.sleep(1) def test_staleness(self):