]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug in the versioned_history example where column-level INSERT
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 24 Feb 2014 17:34:54 +0000 (12:34 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 24 Feb 2014 17:34:54 +0000 (12:34 -0500)
defaults would prevent history values of NULL from being written.

doc/build/changelog/changelog_09.rst
examples/versioned_history/history_meta.py
examples/versioned_history/test_versioning.py

index 5a94e5759680cb16cc7a1896cfc381dda72c0f76..bbd843cb1552d008bee085fdf268b15a7f2c02f6 100644 (file)
 .. changelog::
     :version: 0.9.4
 
+    .. change::
+        :tags: bug, examples
+
+        Fixed bug in the versioned_history example where column-level INSERT
+        defaults would prevent history values of NULL from being written.
+
     .. change::
         :tags: orm, bug, sqlite
         :tickets: 2969
index c4479d99ef0faea99abe189497becd8d853bf7d3..f9e979a6a955a36cf99b67e1ef40395fc12aff7f 100644 (file)
@@ -32,14 +32,19 @@ def _history_mapper(local_mapper):
     polymorphic_on = None
     super_fks = []
 
+    def _col_copy(col):
+        col = col.copy()
+        col.unique = False
+        col.default = col.server_default = None
+        return col
+
     if not super_mapper or local_mapper.local_table is not super_mapper.local_table:
         cols = []
         for column in local_mapper.local_table.c:
             if _is_versioning_col(column):
                 continue
 
-            col = column.copy()
-            col.unique = False
+            col = _col_copy(column)
 
             if super_mapper and col_references_table(column, super_mapper.local_table):
                 super_fks.append((col.key, list(super_history_mapper.local_table.primary_key)[0]))
@@ -80,8 +85,7 @@ def _history_mapper(local_mapper):
         # been added and add them to the history table.
         for column in local_mapper.local_table.c:
             if column.key not in super_history_mapper.local_table.c:
-                col = column.copy()
-                col.unique = False
+                col = _col_copy(column)
                 super_history_mapper.local_table.append_column(col)
         table = None
 
index 73f515ed4b1c753eca0b27042740710aec20afa9..1a0bfec04ea3b0a37c17e383e69afc0383b4b6fa 100644 (file)
@@ -3,7 +3,7 @@
 from unittest import TestCase
 from sqlalchemy.ext.declarative import declarative_base
 from .history_meta import Versioned, versioned_session
-from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
+from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Boolean
 from sqlalchemy.orm import clear_mappers, Session, deferred, relationship
 from sqlalchemy.testing import AssertsCompiledSQL, eq_, assert_raises
 from sqlalchemy.testing.entities import ComparableEntity
@@ -142,6 +142,35 @@ class TestVersioning(TestCase, AssertsCompiledSQL):
 
         assert sc.version == 2
 
+    def test_insert_null(self):
+        class SomeClass(Versioned, self.Base, ComparableEntity):
+            __tablename__ = 'sometable'
+
+            id = Column(Integer, primary_key=True)
+            boole = Column(Boolean, default=False)
+
+        self.create_tables()
+        sess = self.session
+        sc = SomeClass(boole=True)
+        sess.add(sc)
+        sess.commit()
+
+        sc.boole = None
+        sess.commit()
+
+        sc.boole = False
+        sess.commit()
+
+        SomeClassHistory = SomeClass.__history_mapper__.class_
+
+        eq_(
+            sess.query(SomeClassHistory.boole).order_by(SomeClassHistory.id).all(),
+            [(True, ), (None, )]
+        )
+
+        eq_(sc.version, 3)
+
+
     def test_deferred(self):
         """test versioning of unloaded, deferred columns."""