Как сохранить объект записи sqlalchemy в memcache - PullRequest
0 голосов
/ 31 мая 2018

код:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DBSession = sessionmaker()
DBSession.bind = engine
session = DBSession()
engine = create_engine('mysql://root:password@localhost/db', echo=True)
Base = declarative_base(engine)

class Accounts(Base):
    __tablename__ = 'accounts'
    __table_args__ = {'autoload': True}

Я пытаюсь сохранить объект записи sqlalchemy в memcache

from pymemcache.client.base import Client
client = Client(('localhost', 11211))
client.set('testkey', session.query(Users).get(1))

Он хранит строковый объект вместо объекта пользователя
вывод: '<__main__.Users object at 0x105b69b10>'

Любая помощь?

Спасибо заранее

Ответы [ 2 ]

0 голосов
/ 23 июля 2018

Как @SuperShoot упоминает в своем ответе, pymemcache ожидает хранить представление str.Поскольку ваш экземпляр (запись) модели SQLAlchemy изначально не является представлением str, pymemcache пытается вызвать метод по умолчанию __str__(), который приводит к нежелательному результату.

Вам нужен промежуточный шаг, которыйбудет сериализовать ваш экземпляр модели SQLAlchemy в str той или иной структуры.Это делает ваш логически циклически переключаемый поток:

  1. Сериализуйте экземпляр вашей модели в str той или иной структуры.
  2. Сохраните сериализованный str, используя pymemcache.
  3. При извлечении str из pymemcache десериализовайте его в экземпляр модели SQLAlchemy, чтобы продолжить с ним легко работать в коде Python.

Это может бытьНемного сложнее с моделями SQLAlchemy, поэтому я рекомендую использовать библиотеку SQLAthanor (полное раскрытие: я автор).Он позволяет вам сериализовать вашу модель SQLAlchemy в CSV, JSON или YAML, которую затем можно сохранить в memcache.Кроме того, он также позволяет легко десериализовать строку CSV, JSON или YAML в экземпляр модели SQLAlchemy, что позволяет легко поддерживать весь поток, описанный выше.

В библиотеке гораздо больше функциональности, котораявы можете прочитать на странице документации: https://sqlathanor.readthedocs.io/en/latest/

Важно помнить, что при использовании SQLAthanor вам нужно будет решить, в каком формате вы хотите хранить свои данные (я рекомендую JSON или YAML), а затем явно сконфигурируйте столбцы / атрибуты, которые вы хотите сериализовать в этот формат (это функция безопасности в библиотеке).Поскольку ваш фрагмент кода показывает, что вы используете декларативное отражение, вы, вероятно, захотите взглянуть на следующие разделы документации по настройке SQLAthanor:

Надеюсь, это поможет!

0 голосов
/ 01 июня 2018

Проблема не столько в том, как хранить объект SQLAlchemy, сколько в том, как хранить любой экземпляр объекта.

Это из строки документации pymemcache Clientкласс, который вы импортировали:

Значения должны иметь метод str () для преобразования себя в байтовую строку.

Youn 'В него включено определение класса Users, с которым вы запрашиваете базу данных, поэтому я могу только предположить, что вы не переопределили __str__.Поэтому, когда pymemcache пытается преобразовать ваш объект в байтовую строку, он вызывает реализацию __str__ по умолчанию для Python и сохраняет ее.

...