Расширение сериализатора выражений

Объекты сериализатора/десериализатора для использования со структурами запросов SQLAlchemy, позволяющие осуществлять «контекстную» десериализацию.

Legacy Feature

Расширение сериализатора является легендарным и не должно использоваться для новых разработок.

Можно использовать любую структуру запросов SQLAlchemy, основанную на sqlalchemy.sql.* или sqlalchemy.orm.*. Мапперы, таблицы, столбцы, сессии и т.д., на которые ссылается структура, не сохраняются в сериализованной форме, но вместо этого повторно ассоциируются со структурой запроса при ее десериализации.

Предупреждение

Расширение сериализатора использует pickle для сериализации и десериализации объектов, поэтому применяются те же соображения безопасности, о которых говорилось в python documentation.

Использование почти такое же, как и у стандартного модуля 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()

Применяются те же ограничения, что и при использовании raw pickle; сопоставленные классы должны быть pickleable, то есть импортируемыми из пространства имен на уровне модуля.

Модуль сериализатора подходит только для структур запросов. Он не нужен для:

  • экземпляры классов, определяемых пользователем. Они не содержат ссылок на движки, сессии или конструкции выражений в типичном случае и могут быть сериализованы напрямую.

  • Метаданные таблицы, которые должны быть загружены полностью из сериализованной структуры (т.е. еще не объявлены в приложении). Обычные pickle.loads()/dumps() могут быть использованы для полного дампа любого объекта MetaData, обычно того, который был отражен из существующей базы данных в какой-то предыдущий момент времени. Модуль serializer предназначен специально для противоположного случая, когда метаданные таблицы уже присутствуют в памяти.

Object Name Description

Deserializer(file[, metadata, scoped_session, engine])

dumps(obj[, protocol])

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

Serializer(*args, **kw)

function sqlalchemy.ext.serializer.Deserializer(file, metadata=None, scoped_session=None, engine=None)
function sqlalchemy.ext.serializer.Serializer(*args, **kw)
function sqlalchemy.ext.serializer.dumps(obj, protocol=5)
function sqlalchemy.ext.serializer.loads(data, metadata=None, scoped_session=None, engine=None)
Вернуться на верх