Ńņ Š„[Jc@sdZddklZlZddklZddklZddkl Z ddk l Z l Z ddk lZddklZdd kZdd kZdd klZd d d dgZd„ZeidƒZd d d d„Zd„Zd d d d„Zd S(sSerializer/Deserializer objects for usage with SQLAlchemy structures. Any SQLAlchemy structure, including Tables, Columns, expressions, mappers, Query objects etc. can be serialized in a minimally-sized format, and deserialized when given a Metadata and optional ScopedSession object to use as context on the way out. Usage is nearly the same as that of the standard Python pickle module:: from sqlalchemy.ext.serializer import loads, dumps metadata = MetaData(bind=some_engine) Session = scoped_session(sessionmaker()) # ... define mappers query = Session.query(MyClass).filter(MyClass.somedata=='foo').order_by(MyClass.sortkey) # pickle the query serialized = dumps(query) # unpickle. Pass in metadata + scoped_session query2 = loads(serialized, metadata, Session) print query2.all() Similar restrictions as when using raw pickle apply; mapped classes must be themselves be pickleable, meaning they are importable from a module-level namespace. Note that instances of user-defined classes do not require this extension in order to be pickled; these contain no references to engines, sessions or expression constructs in the typical case and can be serialized directly. This module is specifically for ORM and expression constructs. i’’’’(t class_mappertQuery(tSession(tMapper(tQueryableAttribute(tTabletColumn(tEngine(tpickleN(tStringIOt Serializert DeserializertdumpstloadscOs(ti||Ž}d„}||_|S(NcSs3t|tƒo@|ii}|ii}d|dtiti|ƒƒ}nąt|t ƒo.|i o#dtiti|iƒƒ}n¢t|t ƒodt |ƒ}n~t|t ƒo5t|it ƒo"dt |iƒd|i}n9t|tƒo d}nt|tƒo d}ndS|S(Ns attribute:t:smapper:stable:scolumn:ssession:sengine:(t isinstanceRtimpltclass_tkeytbase64t b64encodeRR Rt non_primaryRtstrRttableRRtNone(tobjtclsRtid((s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyt persistent_id5s   (##"  (RtPicklerR(targstkwtpicklerR((s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyR 2s  s3(mapper|table|column|session|attribute|engine):(.*)csFti|ƒ}‡‡‡fd†‰‡‡‡fd†}||_|S(NcsLˆoˆSˆoˆƒio ˆƒiSˆoˆioˆiSdSdS(N(tbindR((tenginetscoped_sessiontmetadata(s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyt get_engineQs c s7ti|ƒ}|pdS|iddƒ\}}|djo;|idƒ\}}titi|ƒƒ}t ||ƒS|djo#titi|ƒƒ}t |ƒS|djo ˆi |S|djo(|idƒ\}}ˆi |i |S|djoˆƒS|d joˆƒSt d |ƒ‚dS( Niit attributeRtmapperRtcolumntsessionR"sUnknown token: %s(tour_idstmatchRtgrouptsplitRR Rt b64decodetgetattrRttablestct Exception( Rtmttype_RRtclsargRRtcolname(R%R$R#(s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pytpersistent_load[s*        (Rt UnpicklerR7(tfileR$R#R"t unpicklerR7((R"R%R#R$s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyR Ns   cCs,tƒ}t|ƒ}|i|ƒ|iƒS(N(R R tdumptgetvalue(RtbufR ((s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyR vs   cCs+t|ƒ}t||||ƒ}|iƒS(N(R R tload(tdataR$R#R"R=R:((s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyR |s (t__doc__tsqlalchemy.ormRRtsqlalchemy.orm.sessionRtsqlalchemy.orm.mapperRtsqlalchemy.orm.attributesRt sqlalchemyRRtsqlalchemy.engineRtsqlalchemy.utilRtreRt cStringIOR t__all__R tcompileR*RR R R (((s=/usr/lib/python2.6/site-packages/sqlalchemy/ext/serializer.pyt#s    (