]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed regression whereby MetaData() coming
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 23 Mar 2011 21:25:57 +0000 (17:25 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 23 Mar 2011 21:25:57 +0000 (17:25 -0400)
back from unpickling did not keep track of
new things it keeps track of now, i.e.
collection of Sequence objects, list
of schema names.  [ticket:2104]

CHANGES
lib/sqlalchemy/schema.py
test/sql/test_metadata.py

diff --git a/CHANGES b/CHANGES
index 60a09b2ea1a2e53d107c0bb94663bc9844d4ed3b..7cab20449211a685afadf5f00c95ffeeaafa529c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,12 @@ CHANGES
     This so that code which does something like
     Integer(11) still succeeds.
 
+  - Fixed regression whereby MetaData() coming
+    back from unpickling did not keep track of 
+    new things it keeps track of now, i.e.
+    collection of Sequence objects, list
+    of schema names.  [ticket:2104]
+
 0.7.0b3
 =======
 - general
index bc3eac21308dcde90da08281fab20f251e52a0bc..c8d00f407473f253b5747c450c85a27bde29aabb 100644 (file)
@@ -2101,7 +2101,6 @@ class MetaData(SchemaItem):
         self._schemas = set()
         self._sequences = set()
         self.bind = bind
-        self.metadata = self
         if reflect:
             if not bind:
                 raise exc.ArgumentError(
@@ -2132,11 +2131,13 @@ class MetaData(SchemaItem):
                                 if t.schema is not None])
 
     def __getstate__(self):
-        return {'tables': self.tables}
+        return {'tables': self.tables, 'schemas':self._schemas}
 
     def __setstate__(self, state):
         self.tables = state['tables']
         self._bind = None
+        self._sequences = set()
+        self._schemas = state['schemas']
 
     def is_bound(self):
         """True if this MetaData is bound to an Engine or Connection."""
index 4c0abd1f0faf4f28d5eb245f682530d092cb0ff5..04bc0c345668c30407b550a8946052d66ba03f2f 100644 (file)
@@ -239,13 +239,15 @@ class MetaDataTest(TestBase, ComparesTables):
             meta3 = pickle.loads(pickle.dumps(meta2))
             assert meta3.bind is None
             assert meta3.tables['mytable'] is not t1
+
             return (meta3.tables['mytable'], meta3.tables['othertable'])
 
         meta.create_all(testing.db)
         try:
-            for test, has_constraints, reflect in (test_to_metadata,
-                    True, False), (test_pickle, True, False), \
-                (test_pickle_via_reflect, False, True):
+            for test, has_constraints, reflect in \
+                    (test_to_metadata, True, False), \
+                    (test_pickle, True, False), \
+                    (test_pickle_via_reflect, False, True):
                 table_c, table2_c = test()
                 self.assert_tables_equal(table, table_c)
                 self.assert_tables_equal(table2, table2_c)
@@ -281,9 +283,40 @@ class MetaDataTest(TestBase, ComparesTables):
                         assert False
                     assert c.columns.contains_column(table_c.c.name)
                     assert not c.columns.contains_column(table.c.name)
+
+
         finally:
             meta.drop_all(testing.db)
 
+    def test_pickle_metadata_sequence(self):
+        m1 = MetaData()
+        Table('a',m1,
+             Column('id',Integer,primary_key=True),
+             Column('x', Integer, Sequence("x_seq")))
+
+        m2 = pickle.loads(pickle.dumps(m1))
+
+        t2 = Table('a', m2, 
+             Column('id',Integer,primary_key=True),
+             Column('x', Integer, Sequence("x_seq")),
+             useexisting=True)
+
+        eq_(m2._sequences, set([t2.c.x.default]))
+
+    def test_pickle_metadata_schema(self):
+        m1 = MetaData()
+        Table('a',m1,
+             Column('id',Integer,primary_key=True),
+             Column('x', Integer, Sequence("x_seq")),
+             schema='y')
+
+        m2 = pickle.loads(pickle.dumps(m1))
+
+        t2 = Table('a', m2, schema='y',
+             useexisting=True)
+
+        eq_(m2._schemas, m1._schemas)
+
     def test_tometadata_with_schema(self):
         meta = MetaData()