⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 custom_pickler.py

📁 SQLAlchemy. 经典的Python ORM框架。学习必看。
💻 PY
字号:
"""illustrates one way to use a custom pickler that is session-aware."""from sqlalchemy import *from sqlalchemy.orm import *from sqlalchemy.orm.session import object_sessionfrom cStringIO import StringIOfrom pickle import Pickler, Unpicklerimport threadingmeta = MetaData('sqlite://')meta.bind.echo = Trueclass 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.save(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):    passclass Bar(object):    def __init__(self, value):        self.data = value    mapper(Foo, foo_table, extension=MyExt())mapper(Bar, bar_table)sess = create_session()f = Foo()f.bar = Bar('some bar')sess.save(f)sess.flush()sess.clear()del MyPickler.sessions.currentf = sess.query(Foo).get(f.id)assert f.bar.data == 'some bar'

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -