From: Mike Bayer Date: Mon, 21 Mar 2016 18:25:49 +0000 (-0400) Subject: - Added a fix to Postgresql server default comparison which first checks X-Git-Tag: rel_0_8_6~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9538c3e1a71c946a53f8762e68e94cfbcb9f932f;p=thirdparty%2Fsqlalchemy%2Falembic.git - Added a fix to Postgresql server default comparison which first checks if the text of the default is identical to the original, before attempting to actually run the default. This accomodates for default-generation functions that generate a new value each time such as a uuid function. fixes #365 - test against uuid_generate_v4() directly, but this requires extensions to be installed. should come up with a built in function for this test --- diff --git a/alembic/ddl/postgresql.py b/alembic/ddl/postgresql.py index 057ae420..dd76639f 100644 --- a/alembic/ddl/postgresql.py +++ b/alembic/ddl/postgresql.py @@ -37,8 +37,12 @@ class PostgresqlImpl(DefaultImpl): conn_col_default = rendered_inspector_default + defaults_equal = conn_col_default == rendered_metadata_default + if defaults_equal: + return False + if None in (conn_col_default, rendered_metadata_default): - return conn_col_default != rendered_metadata_default + return not defaults_equal if metadata_column.server_default is not None and \ isinstance(metadata_column.server_default.arg, diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index a4fea827..4ac59414 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -6,6 +6,15 @@ Changelog .. changelog:: :version: 0.8.6 + .. change:: + :tags: bug, postgresql + :tickets: 365 + + Added a fix to Postgresql server default comparison which first checks + if the text of the default is identical to the original, before attempting + to actually run the default. This accomodates for default-generation + functions that generate a new value each time such as a uuid function. + .. change:: :tags: bug, batch :tickets: 361 diff --git a/tests/requirements.py b/tests/requirements.py index dd0de63c..70db3e63 100644 --- a/tests/requirements.py +++ b/tests/requirements.py @@ -78,3 +78,16 @@ class DefaultRequirements(SuiteRequirements): return exclusions.fails_on_everything_except( 'postgresql', 'oracle', 'mssql', 'sybase') + + @property + def postgresql_uuid_ossp(self): + def check_uuid_ossp(config): + if not exclusions.against(config, "postgresql"): + return False + try: + config.db.execute("SELECT uuid_generate_v4()") + return True + except: + return False + + return exclusions.only_if(check_uuid_ossp) diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index 21ba6b9e..b9973c28 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -1,7 +1,7 @@ from sqlalchemy import DateTime, MetaData, Table, Column, text, Integer, \ String, Interval, Sequence, Numeric, BigInteger, Float, Numeric -from sqlalchemy.dialects.postgresql import ARRAY +from sqlalchemy.dialects.postgresql import ARRAY, UUID from sqlalchemy.engine.reflection import Inspector from alembic.operations import Operations from sqlalchemy.sql import table, column @@ -234,6 +234,13 @@ class PostgresqlDefaultCompareTest(TestBase): "14 days" ) + @config.requirements.postgresql_uuid_ossp + def test_compare_uuid_text(self): + self._compare_default_roundtrip( + UUID, + text("uuid_generate_v4()") + ) + def test_compare_interval_text(self): self._compare_default_roundtrip( Interval,