Skip to content
This repository was archived by the owner on May 14, 2026. It is now read-only.

feat: Support Server-Side Checks for Enums#694

Merged
olavloite merged 1 commit into
googleapis:mainfrom
waltaskew:native-enums
Jun 27, 2025
Merged

feat: Support Server-Side Checks for Enums#694
olavloite merged 1 commit into
googleapis:mainfrom
waltaskew:native-enums

Conversation

@waltaskew

@waltaskew waltaskew commented Jun 12, 2025

Copy link
Copy Markdown
Contributor

Spanner uses protos for enums. Creating a column like Column("an_enum", Enum("A", "B", "C", create_constraint=True)) 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

@product-auto-label product-auto-label Bot added the api: spanner Issues related to the googleapis/python-spanner-sqlalchemy API. label Jun 12, 2025
# 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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure this change is enough to actually achieve this. Would you otherwise mind adding a test that shows that it does?

I tried the same here, but it does not seem to make any difference: https://github.com/googleapis/python-spanner-sqlalchemy/pull/698/files

@waltaskew waltaskew Jun 23, 2025

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I should have added a test here. You need to additionally pass create_constraint=True into the Enum constructor to generate the CHECK constraints. If supports_native_enum=True, it won't actually generate the CHECK constraints when setting create_constraint=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 allows SQLAlchemy
to generate check constraints to enforce the enum values if the
create_constraint=True flag is passed to the Enum constructor.

Fixes: googleapis#686
@olavloite olavloite added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Jun 27, 2025
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Jun 27, 2025
@olavloite
olavloite requested a review from aakashanandg June 27, 2025 10:50
@olavloite
olavloite merged commit 17e3aba into googleapis:main Jun 27, 2025
15 of 16 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

api: spanner Issues related to the googleapis/python-spanner-sqlalchemy API.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Enums Not Enforced Server-Side

4 participants