Skip to content

feat: Support Server-Side Checks for Enums #694

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 27, 2025

Conversation

waltaskew
Copy link
Contributor

@waltaskew waltaskew commented Jun 12, 2025

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
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

Copy link
Contributor Author

@waltaskew waltaskew Jun 23, 2025

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 join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: spanner Issues related to the googleapis/python-spanner-sqlalchemy API.
4 participants