表达式序列化扩展

用于 SQLAlchemy 查询结构的序列化器/反序列化器对象,允许“上下文”反序列化。

传统功能

序列化扩展是传统的,不应用于新开发。

任何基于 sqlalchemy.sql.* 或 sqlalchemy.orm.* 的 SQLAlchemy 查询结构都可以使用。结构中引用的映射器、表、列、会话等不会以序列化形式持久化,而是会在反序列化时重新与查询结构关联。

警告

序列化扩展使用 pickle 来序列化和反序列化对象,因此 python 文档 中提到的相同安全注意事项适用。

使用方法与标准 Python pickle 模块几乎相同

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()

与使用原始 pickle 时相同的限制适用;映射的类本身必须是可 pickle 的,这意味着它们可以从模块级命名空间导入。

序列化模块仅适用于查询结构。它不需要用于

  • 用户定义类的实例。在典型情况下,这些实例不包含对引擎、会话或表达式结构的引用,可以直接序列化。

  • 要完全从序列化结构加载的表元数据(即在应用程序中尚未声明)。可以使用常规的 pickle.loads()/dumps() 来完全转储任何 MetaData 对象,通常是在之前某个时间点从现有数据库中反射出来的对象。序列化模块专门用于相反的情况,即表元数据已经存在于内存中。

对象名称 描述

反序列化器

dumps(obj[, protocol])

loads(data[, metadata, scoped_session, engine])

序列化器

class sqlalchemy.ext.serializer.Deserializer

类签名

class sqlalchemy.ext.serializer.Deserializer (_pickle.Unpickler)

method sqlalchemy.ext.serializer.Deserializer.get_engine()
method sqlalchemy.ext.serializer.Deserializer.persistent_load(id_)
class sqlalchemy.ext.serializer.Serializer

类签名

class sqlalchemy.ext.serializer.Serializer (_pickle.Pickler)

method sqlalchemy.ext.serializer.Serializer.persistent_id(obj)
function sqlalchemy.ext.serializer.dumps(obj, protocol=5)
function sqlalchemy.ext.serializer.loads(data, metadata=None, scoped_session=None, engine=None)