Skip to content

Commit

Permalink
fix: ALTER COLUMN NOT NULL directive fails because of inappropriate s…
Browse files Browse the repository at this point in the history
…yntax (#124)

* fix: ALTER COLUMN NOT NULL directive fails because of inappropriate syntax

* add alembic into nox session dependencies

* alembic dependency
  • Loading branch information
Ilya Gurov committed Oct 11, 2021
1 parent 406c34b commit c433cda
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 7 deletions.
37 changes: 35 additions & 2 deletions google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py
Expand Up @@ -15,10 +15,17 @@
import pkg_resources
import re

from sqlalchemy import types, ForeignKeyConstraint
from alembic.ddl.base import (
ColumnNullable,
ColumnType,
alter_column,
alter_table,
format_type,
)
from sqlalchemy import ForeignKeyConstraint, types, util
from sqlalchemy.engine.base import Engine
from sqlalchemy.engine.default import DefaultDialect
from sqlalchemy import util
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.compiler import (
selectable,
DDLCompiler,
Expand All @@ -27,6 +34,7 @@
SQLCompiler,
RESERVED_WORDS,
)

from google.cloud import spanner_dbapi
from google.cloud.sqlalchemy_spanner._opentelemetry_tracing import trace_call

Expand Down Expand Up @@ -864,3 +872,28 @@ def do_execute_no_params(self, cursor, statement, context=None):
}
with trace_call("SpannerSqlAlchemy.ExecuteNoParams", trace_attributes):
cursor.execute(statement)


# Alembic ALTER operation override
@compiles(ColumnNullable, "spanner")
def visit_column_nullable(
element: "ColumnNullable", compiler: "SpannerDDLCompiler", **kw
) -> str:
return "%s %s %s %s" % (
alter_table(compiler, element.table_name, element.schema),
alter_column(compiler, element.column_name),
format_type(compiler, element.existing_type),
"" if element.nullable else "NOT NULL",
)


# Alembic ALTER operation override
@compiles(ColumnType, "spanner")
def visit_column_type(
element: "ColumnType", compiler: "SpannerDDLCompiler", **kw
) -> str:
return "%s %s %s" % (
alter_table(compiler, element.table_name, element.schema),
alter_column(compiler, element.column_name),
"%s" % format_type(compiler, element.type_),
)
8 changes: 4 additions & 4 deletions migration_test_cleanup.py
Expand Up @@ -27,11 +27,11 @@
config.read("setup.cfg")
db_url = config.get("db", "default")

project = re.findall(r'projects(.*?)instances', db_url)
instance_id = re.findall(r'instances(.*?)databases', db_url)
project = re.findall(r"projects(.*?)instances", db_url)
instance_id = re.findall(r"instances(.*?)databases", db_url)

client = spanner.Client(project="".join(project).replace('/', ''))
instance = client.instance(instance_id="".join(instance_id).replace('/', ''))
client = spanner.Client(project="".join(project).replace("/", ""))
instance = client.instance(instance_id="".join(instance_id).replace("/", ""))
database = instance.database("compliance-test")

database.update_ddl(["DROP TABLE account", "DROP TABLE alembic_version"]).result(120)
6 changes: 6 additions & 0 deletions noxfile.py
Expand Up @@ -60,6 +60,12 @@ class = StreamHandler
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String(50), nullable=False),
sa.Column('description', sa.Unicode(200)),
)
op.alter_column(
'account',
'name',
existing_type=sa.String(50),
nullable=True,
)"""


Expand Down
6 changes: 5 additions & 1 deletion setup.py
Expand Up @@ -19,7 +19,11 @@

name = "sqlalchemy-spanner"
description = "SQLAlchemy dialect integrated into Cloud Spanner database"
dependencies = ["sqlalchemy>=1.1.13, <=1.3.23", "google-cloud-spanner>=3.3.0"]
dependencies = [
"sqlalchemy>=1.1.13, <=1.3.23",
"google-cloud-spanner>=3.3.0",
"alembic",
]
extras = {
"tracing": [
"opentelemetry-api >= 1.1.0",
Expand Down

0 comments on commit c433cda

Please sign in to comment.