diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2023-02-16 15:10:23 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2023-02-16 15:10:23 +0000 |
commit | 5e995e21896c5db557cb81c58767dc5804b07a92 (patch) | |
tree | ff8ac82d9c1a61499a606f3f247b9973acbff870 /alembic | |
parent | c690d08bf77724159e9dc8542e12eef57604b2ad (diff) | |
parent | 8d97de0ba7ee8dbff4301be6a2bd76a963327d0f (diff) | |
download | alembic-5e995e21896c5db557cb81c58767dc5804b07a92.tar.gz |
Merge "collapse all chars for mssql defaults, move quoting" into main
Diffstat (limited to 'alembic')
-rw-r--r-- | alembic/ddl/mssql.py | 17 | ||||
-rw-r--r-- | alembic/ddl/postgresql.py | 29 |
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 ) ) |