表达式序列化器扩展

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

旧版特性

序列化器扩展是旧版的,不应在新开发中使用。

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

警告

序列化器扩展使用 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)