From c5c196ea2d3d8d84e6040ce3bda2f0734c98147e Mon Sep 17 00:00:00 2001 From: Walt Askew Date: Thu, 12 Jun 2025 17:21:52 +0000 Subject: [PATCH] feat: Support Server-Side Checks for Enums Spanner uses protos for enums. Creating a column like Column("an_enum", Enum("A", "B", "C")) will result in a String column. Setting supports_native_enum to False means SQLAlchemy will generate check constraints to enforce the enum values server-side rather than rely on a the database's native enum type to enforce them. Fixes: #686 --- google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index 8e935fb2..3f52b8a5 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -798,10 +798,16 @@ class SpannerDialect(DefaultDialect): supports_sequences = True sequences_optional = False supports_identity_columns = True - supports_native_enum = True supports_native_boolean = True supports_native_decimal = True supports_statement_cache = True + # Spanner uses protos for enums. Creating a column like + # Column("an_enum", Enum("A", "B", "C")) will result in a String + # column. Setting supports_native_enum to False means SQLAlchemy + # will generate check constraints to enforce the enum values + # server-side rather than rely on a the database's native enum + # type to enforce them. + supports_native_enum = False postfetch_lastrowid = False insert_returning = True