Расширение сериализатора выражений¶
Объекты сериализатора/десериализатора для использования со структурами запросов 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)¶