summaryrefslogtreecommitdiff
path: root/examples/pickle/custom_pickler.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-01-18 21:35:18 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2010-01-18 21:35:18 +0000
commitf15eb50a75c67f936382ce986c60f97fbd8430bd (patch)
tree712f770cb3aa8ea645082eb60f2d5470d3a302be /examples/pickle/custom_pickler.py
parent7f91210e945fe24d95f88c47a726bf4959925f96 (diff)
downloadsqlalchemy-f15eb50a75c67f936382ce986c60f97fbd8430bd.tar.gz
sorry, this example is just ridiculous
Diffstat (limited to 'examples/pickle/custom_pickler.py')
-rw-r--r--examples/pickle/custom_pickler.py91
1 files changed, 0 insertions, 91 deletions
diff --git a/examples/pickle/custom_pickler.py b/examples/pickle/custom_pickler.py
deleted file mode 100644
index a02b708e5..000000000
--- a/examples/pickle/custom_pickler.py
+++ /dev/null
@@ -1,91 +0,0 @@
-"""illustrates one way to use a custom pickler that is session-aware."""
-
-from sqlalchemy import MetaData, Table, Column, Integer, String, PickleType
-from sqlalchemy.orm import (mapper, create_session, MapperExtension,
- class_mapper, EXT_CONTINUE)
-from sqlalchemy.orm.session import object_session
-from cStringIO import StringIO
-from pickle import Pickler, Unpickler
-import threading
-
-meta = MetaData('sqlite://')
-meta.bind.echo = True
-
-class MyExt(MapperExtension):
- def populate_instance(self, mapper, selectcontext, row, instance, **flags):
- MyPickler.sessions.current = selectcontext.session
- return EXT_CONTINUE
- def before_insert(self, mapper, connection, instance):
- MyPickler.sessions.current = object_session(instance)
- return EXT_CONTINUE
- def before_update(self, mapper, connection, instance):
- MyPickler.sessions.current = object_session(instance)
- return EXT_CONTINUE
-
-class MyPickler(object):
- sessions = threading.local()
-
- def persistent_id(self, obj):
- if getattr(obj, "id", None) is None:
- sess = MyPickler.sessions.current
- newsess = create_session(bind=sess.connection(class_mapper(Bar)))
- newsess.add(obj)
- newsess.flush()
- key = "%s:%s" % (type(obj).__name__, obj.id)
- return key
-
- def persistent_load(self, key):
- name, ident = key.split(":")
- sess = MyPickler.sessions.current
- return sess.query(Bar).get(ident)
-
- def dumps(self, graph, protocol):
- src = StringIO()
- pickler = Pickler(src)
- pickler.persistent_id = self.persistent_id
- pickler.dump(graph)
- return src.getvalue()
-
- def loads(self, data):
- dst = StringIO(data)
- unpickler = Unpickler(dst)
- unpickler.persistent_load = self.persistent_load
- return unpickler.load()
-
-foo_table = Table('foo', meta,
- Column('id', Integer, primary_key=True),
- Column('bar', PickleType(pickler=MyPickler()), nullable=False))
-
-bar_table = Table('bar', meta,
- Column('id', Integer, primary_key=True),
- Column('data', String(40)))
-
-meta.create_all()
-
-class Foo(object):
- pass
-
-class Bar(object):
- def __init__(self, value):
- self.data = value
-
- def __eq__(self, other):
- if not other is None:
- return self.data == other.data
- return NotImplemented
-
-
-mapper(Foo, foo_table, extension=MyExt())
-mapper(Bar, bar_table)
-
-sess = create_session()
-f = Foo()
-f.bar = Bar('some bar')
-sess.add(f)
-sess.flush()
-sess.expunge_all()
-
-del MyPickler.sessions.current
-
-f = sess.query(Foo).get(f.id)
-assert f.bar.data == 'some bar'