]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- Added a fix to Postgresql server default comparison which first checks
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 21 Mar 2016 18:25:49 +0000 (14:25 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 21 Mar 2016 18:25:49 +0000 (14:25 -0400)
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

alembic/ddl/postgresql.py
docs/build/changelog.rst
tests/requirements.py
tests/test_postgresql.py

index 057ae4200c03b07456b561491336d6aa737d96b2..dd76639f8c1f29f6cc57c37053d91827182dac33 100644 (file)
@@ -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,
index a4fea82700e93f857e50ef81ca650d958bc042b7..4ac5941458a6cd8669c8f150291591fe550010bc 100644 (file)
@@ -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
index dd0de63c30838653515532c74ba40c83de829048..70db3e63dc00b957fd825f44e2997bb94388b385 100644 (file)
@@ -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)
index 21ba6b9e7cb78e1b8cc370cc1fd0c916533907ae..b9973c28324bd68b2c098d116e59e6580a83abf0 100644 (file)
@@ -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,