summaryrefslogtreecommitdiff
path: root/alembic
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2023-02-16 15:10:23 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2023-02-16 15:10:23 +0000
commit5e995e21896c5db557cb81c58767dc5804b07a92 (patch)
treeff8ac82d9c1a61499a606f3f247b9973acbff870 /alembic
parentc690d08bf77724159e9dc8542e12eef57604b2ad (diff)
parent8d97de0ba7ee8dbff4301be6a2bd76a963327d0f (diff)
downloadalembic-5e995e21896c5db557cb81c58767dc5804b07a92.tar.gz
Merge "collapse all chars for mssql defaults, move quoting" into main
Diffstat (limited to 'alembic')
-rw-r--r--alembic/ddl/mssql.py17
-rw-r--r--alembic/ddl/postgresql.py29
2 files changed, 21 insertions, 25 deletions
diff --git a/alembic/ddl/mssql.py b/alembic/ddl/mssql.py
index b622bc5..bdf215d 100644
--- a/alembic/ddl/mssql.py
+++ b/alembic/ddl/mssql.py
@@ -233,26 +233,17 @@ class MSSQLImpl(DefaultImpl):
):
if rendered_metadata_default is not None:
- rendered_metadata_default = re.sub(
- r"^\((.+)\)$", r"\1", rendered_metadata_default
- )
rendered_metadata_default = re.sub(
- r"^\"?'(.+)'\"?$", r"\1", rendered_metadata_default
+ r"[\(\) \"\']", "", rendered_metadata_default
)
if rendered_inspector_default is not None:
-
- # the iteration is a quick hack to remove balanced parens only
- # up to two levels deep, like ((foo)) but not (foo())
- # see issue #1152
- for i in range(2):
- rendered_inspector_default = re.sub(
- r"^\((.+)\)$", r"\1", rendered_inspector_default
- )
+ # SQL Server collapses whitespace and adds arbitrary parenthesis
+ # within expressions. our only option is collapse all of it
rendered_inspector_default = re.sub(
- r"^\"?'(.+)'\"?$", r"\1", rendered_inspector_default
+ r"[\(\) \"\']", "", rendered_inspector_default
)
return rendered_inspector_default != rendered_metadata_default
diff --git a/alembic/ddl/postgresql.py b/alembic/ddl/postgresql.py
index 29efe4c..32674d2 100644
--- a/alembic/ddl/postgresql.py
+++ b/alembic/ddl/postgresql.py
@@ -12,6 +12,7 @@ from typing import TYPE_CHECKING
from typing import Union
from sqlalchemy import Column
+from sqlalchemy import literal_column
from sqlalchemy import Numeric
from sqlalchemy import text
from sqlalchemy import types as sqltypes
@@ -112,22 +113,26 @@ class PostgresqlImpl(DefaultImpl):
if defaults_equal:
return False
- if None in (conn_col_default, rendered_metadata_default):
+ if None in (
+ conn_col_default,
+ rendered_metadata_default,
+ metadata_column.server_default,
+ ):
return not defaults_equal
- # check for unquoted string and quote for PG String types
- if (
- not isinstance(inspector_column.type, Numeric)
- and metadata_column.server_default is not None
- and isinstance(metadata_column.server_default.arg, str)
- and not re.match(r"^'.*'$", rendered_metadata_default)
- ):
- rendered_metadata_default = "'%s'" % rendered_metadata_default
+ metadata_default = metadata_column.server_default.arg
+
+ if isinstance(metadata_default, str):
+ if not isinstance(inspector_column.type, Numeric):
+ metadata_default = re.sub(r"^'|'$", "", metadata_default)
+ metadata_default = f"'{metadata_default}'"
+
+ metadata_default = literal_column(metadata_default)
+ # run a real compare against the server
return not self.connection.scalar(
- text(
- "SELECT %s = %s"
- % (conn_col_default, rendered_metadata_default)
+ sqla_compat._select(
+ literal_column(conn_col_default) == metadata_default
)
)