如何将sqlalchemy记录对象存储到memcache中

时间:2018-05-31 13:10:34

标签: python serialization sqlalchemy memcached

代码:

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 :(得分:0)

问题不在于如何存储SQLAlchemy对象,而在于如何存储任何Object实例。

这是来自您导入的pymemcache Client课程的docstring

  

值必须有 str ()方法才能将自身转换为字节   字符串。

您还没有包含您正在查询数据库的Users类的定义,所以我只能假设您没有覆盖__str__。因此,当pymemcache尝试将您的对象转换为字节字符串时,它会调用python的默认__str__实现并存储它。

答案 1 :(得分:0)

正如@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-然后可以将其持久化到内存缓存。而且,它还使您可以轻松地将CSV,JSON或YAML字符串反序列化为SQLAlchemy模型实例,从而使您轻松维护上述整个流程。

该库有很多功能,您可以在文档页面上阅读:https://sqlathanor.readthedocs.io/en/latest/

要记住的重要一点是,在使用SQLAthanor时,您需要确定要以哪种格式存储数据(我建议使用JSON或YAML),然后显式配置要序列化的列/属性格式(这是库中的安全功能)。因为您的代码段显示您正在使用声明式反射,所以您可能需要查看文档的以下部分,以了解如何配置SQLAthanor:

希望这会有所帮助!