def _render_server_default_for_compare(
- metadata_default: Optional[Any],
- metadata_col: Column,
- autogen_context: AutogenContext,
+ metadata_default: Optional[Any], autogen_context: AutogenContext
) -> Optional[str]:
if isinstance(metadata_default, sa_schema.DefaultClause):
)
)
if isinstance(metadata_default, str):
- if metadata_col.type._type_affinity is sqltypes.String:
- metadata_default = re.sub(r"^'|'$", "", metadata_default)
- return f"'{metadata_default}'"
- else:
- return metadata_default
+ return metadata_default
else:
return None
)
else:
rendered_metadata_default = _render_server_default_for_compare(
- metadata_default, metadata_col, autogen_context
+ metadata_default, autogen_context
)
rendered_conn_default = (
from sqlalchemy.engine.base import Connection
from sqlalchemy.engine.url import URL
from sqlalchemy.sql.elements import ClauseElement
+ from sqlalchemy.sql.schema import Column
+ from sqlalchemy.sql.schema import FetchedValue
from sqlalchemy.sql.schema import MetaData
from sqlalchemy.sql.schema import SchemaItem
]
] = None,
compare_type: bool = False,
- compare_server_default: bool = False,
+ compare_server_default: Union[
+ bool,
+ Callable[
+ [
+ MigrationContext,
+ Column,
+ Column,
+ Optional[str],
+ Optional[FetchedValue],
+ Optional[str],
+ ],
+ Optional[bool],
+ ],
+ ] = False,
render_item: Optional[
Callable[[str, Any, AutogenContext], Union[str, Literal[False]]]
] = None,
and rendered_inspector_default == "'0'"
):
return False
- elif inspector_column.type._type_affinity is sqltypes.Integer:
+ elif (
+ rendered_inspector_default
+ and inspector_column.type._type_affinity is sqltypes.Integer
+ ):
rendered_inspector_default = (
re.sub(r"^'|'$", "", rendered_inspector_default)
if rendered_inspector_default is not None
else None
)
return rendered_inspector_default != rendered_metadata_default
+ elif (
+ rendered_metadata_default
+ and metadata_column.type._type_affinity is sqltypes.String
+ ):
+ metadata_default = re.sub(r"^'|'$", "", rendered_metadata_default)
+ return rendered_inspector_default != f"'{metadata_default}'"
elif rendered_inspector_default and rendered_metadata_default:
# adjust for "function()" vs. "FUNCTION" as can occur particularly
# for the CURRENT_TIMESTAMP function on newer MariaDB versions
from typing import TYPE_CHECKING
from typing import Union
+from sqlalchemy.sql.schema import Column
+from sqlalchemy.sql.schema import FetchedValue
from typing_extensions import Literal
from .migration import _ProxyTransaction
None,
]
+CompareServerDefault = Callable[
+ [
+ MigrationContext,
+ Column,
+ Column,
+ Optional[str],
+ Optional[FetchedValue],
+ Optional[str],
+ ],
+ Optional[bool],
+]
+
class EnvironmentContext(util.ModuleClsProxy):
ProcessRevisionDirectiveFn
] = None,
compare_type: bool = False,
- compare_server_default: bool = False,
+ compare_server_default: Union[bool, CompareServerDefault] = False,
render_item: Optional[RenderItemFn] = None,
literal_binds: bool = False,
upgrade_token: str = "upgrades",
--- /dev/null
+.. change::
+ :tags: changed, autogenerate
+ :tickets: 1178
+
+ Don't modify the metadata server default when comparing it in the
+ autogenerate process.
+ This impacts the value passes to user provided functions passed in
+ :paramref:`.EnvironmentContext.configure.compare_server_default`
+ and third party dialect that implement a custom ``compare_server_default``.
eq_(
_render_server_default_for_compare(
- tab.c.x.server_default, tab.c.x, self.autogen_context
+ tab.c.x.server_default, self.autogen_context
),
c_expected,
)
server_default = diffs[0][0][4]["existing_server_default"]
eq_(
_render_server_default_for_compare(
- server_default, tab.c.x, self.autogen_context
+ server_default, self.autogen_context
),
c_expected,
)