From 31ea13eaf9f766b65527fa7803f05625e9b4bb61 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Tue, 30 Nov 2021 11:17:11 +0300 Subject: [PATCH 1/6] feat: drop temporary tables support --- google/cloud/sqlalchemy_spanner/requirements.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/google/cloud/sqlalchemy_spanner/requirements.py b/google/cloud/sqlalchemy_spanner/requirements.py index 2f30157b..ab45f355 100644 --- a/google/cloud/sqlalchemy_spanner/requirements.py +++ b/google/cloud/sqlalchemy_spanner/requirements.py @@ -68,6 +68,11 @@ def isolation_level(self): def sequences(self): return exclusions.closed() + @property + def temporary_tables(self): + """target database supports temporary tables""" + return exclusions.closed() + def get_order_by_collation(self, _): """Get the default collation name. From 03acb08c87d903b56928a0db03a7aaf1198a1cd5 Mon Sep 17 00:00:00 2001 From: Ilya Gurov Date: Wed, 1 Dec 2021 14:07:48 +0300 Subject: [PATCH 2/6] Update google/cloud/sqlalchemy_spanner/requirements.py Co-authored-by: skuruppu --- google/cloud/sqlalchemy_spanner/requirements.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/sqlalchemy_spanner/requirements.py b/google/cloud/sqlalchemy_spanner/requirements.py index ab45f355..245eebbc 100644 --- a/google/cloud/sqlalchemy_spanner/requirements.py +++ b/google/cloud/sqlalchemy_spanner/requirements.py @@ -70,7 +70,7 @@ def sequences(self): @property def temporary_tables(self): - """target database supports temporary tables""" + """Target database supports temporary tables.""" return exclusions.closed() def get_order_by_collation(self, _): From af56a8bffcee5c02aa479ced697c81f128b50a60 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Wed, 1 Dec 2021 15:36:09 +0300 Subject: [PATCH 3/6] catch TEMPORARY prefixes --- google/cloud/sqlalchemy_spanner/provision.py | 2 +- google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py | 3 +++ test/test_suite.py | 2 -- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/google/cloud/sqlalchemy_spanner/provision.py b/google/cloud/sqlalchemy_spanner/provision.py index 91ff8e92..ce8f36e6 100644 --- a/google/cloud/sqlalchemy_spanner/provision.py +++ b/google/cloud/sqlalchemy_spanner/provision.py @@ -17,4 +17,4 @@ @temp_table_keyword_args.for_db("spanner") def _spanner_temp_table_keyword_args(cfg, eng): - return {} + return {"prefixes": ["TEMPORARY"]} diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index c38a9b8f..a578d4ae 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -341,6 +341,9 @@ def post_create_table(self, table): cols = [col.name for col in table.primary_key.columns] post_cmds = " PRIMARY KEY ({})".format(", ".join(cols)) + if table._prefixes == ["TEMPORARY"]: + raise NotImplementedError("Temporary tables are not supported.") + if table.kwargs.get("spanner_interleave_in"): post_cmds += ",\nINTERLEAVE IN PARENT {}".format( table.kwargs["spanner_interleave_in"] diff --git a/test/test_suite.py b/test/test_suite.py index 0bc4030c..0f136185 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -676,7 +676,6 @@ def define_temp_tables(cls, metadata): creating unique constraints. Overriding the test to replace constraints with indexes in testing data. """ - kw = temp_table_keyword_args(config, config.db) user_tmp = Table( "user_tmp", metadata, @@ -685,7 +684,6 @@ def define_temp_tables(cls, metadata): Column("foo", sqlalchemy.INT), sqlalchemy.Index("user_tmp_uq", "name", unique=True), sqlalchemy.Index("user_tmp_ix", "foo"), - **kw, ) if ( testing.requires.view_reflection.enabled From 30ec806c40925b7e43e7c4a71d4ccc78e73a6e02 Mon Sep 17 00:00:00 2001 From: Ilya Gurov Date: Wed, 1 Dec 2021 15:37:19 +0300 Subject: [PATCH 4/6] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab3651b4..46eae914 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ Data types table mapping SQLAlchemy types to Cloud Spanner types: ### Other limitations - WITH RECURSIVE statement is not supported. - Named schemas are not supported. -- Temporary tables are not supported, real tables are used instead. +- Temporary tables are not supported. - Numeric type dimensions (scale and precision) are constant. See the [docs](https://cloud.google.com/spanner/docs/data-types#numeric_types). ## Best practices From 8e74d9ca8201223bdd0de8aa6e0c7f9963c36867 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Wed, 1 Dec 2021 15:38:49 +0300 Subject: [PATCH 5/6] 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 0f136185..d0976629 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -36,7 +36,6 @@ from sqlalchemy.testing import provide_metadata, emits_warning from sqlalchemy.testing import fixtures from sqlalchemy.testing import is_true -from sqlalchemy.testing.provision import temp_table_keyword_args from sqlalchemy.testing.schema import Column from sqlalchemy.testing.schema import Table from sqlalchemy import literal_column From 9c593abc0cce9de05e5729af3f75c17f01343674 Mon Sep 17 00:00:00 2001 From: larkee <31196561+larkee@users.noreply.github.com> Date: Thu, 2 Dec 2021 11:33:53 +1300 Subject: [PATCH 6/6] Update google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py --- google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index a578d4ae..8f008cad 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -341,7 +341,7 @@ def post_create_table(self, table): cols = [col.name for col in table.primary_key.columns] post_cmds = " PRIMARY KEY ({})".format(", ".join(cols)) - if table._prefixes == ["TEMPORARY"]: + if "TEMPORARY" in table._prefixes: raise NotImplementedError("Temporary tables are not supported.") if table.kwargs.get("spanner_interleave_in"):