diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-02-24 12:34:54 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-02-24 12:34:54 -0500 |
commit | 537d9212938669e7140880387d68e769381d5c2e (patch) | |
tree | 6ab32cbae926349fe45667874a63d6f1d99dc2a2 | |
parent | 8b58c6adc2f000f6ce69e8107d10af3ee6e304ba (diff) | |
download | sqlalchemy-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.rst | 6 | ||||
-rw-r--r-- | examples/versioned_history/history_meta.py | 12 | ||||
-rw-r--r-- | examples/versioned_history/test_versioning.py | 31 |
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.""" |