summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-02-24 12:34:54 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2014-02-24 12:34:54 -0500
commit537d9212938669e7140880387d68e769381d5c2e (patch)
tree6ab32cbae926349fe45667874a63d6f1d99dc2a2
parent8b58c6adc2f000f6ce69e8107d10af3ee6e304ba (diff)
downloadsqlalchemy-537d9212938669e7140880387d68e769381d5c2e.tar.gz
- Fixed bug in the versioned_history example where column-level INSERT
defaults would prevent history values of NULL from being written.
-rw-r--r--doc/build/changelog/changelog_09.rst6
-rw-r--r--examples/versioned_history/history_meta.py12
-rw-r--r--examples/versioned_history/test_versioning.py31
3 files changed, 44 insertions, 5 deletions
diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst
index 5a94e5759..bbd843cb1 100644
--- a/doc/build/changelog/changelog_09.rst
+++ b/doc/build/changelog/changelog_09.rst
@@ -15,6 +15,12 @@
: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
diff --git a/examples/versioned_history/history_meta.py b/examples/versioned_history/history_meta.py
index c4479d99e..f9e979a6a 100644
--- a/examples/versioned_history/history_meta.py
+++ b/examples/versioned_history/history_meta.py
@@ -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
diff --git a/examples/versioned_history/test_versioning.py b/examples/versioned_history/test_versioning.py
index 73f515ed4..1a0bfec04 100644
--- a/examples/versioned_history/test_versioning.py
+++ b/examples/versioned_history/test_versioning.py
@@ -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."""