代码:
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>'
有任何帮助吗?
感谢提前
答案 0 :(得分:0)
问题不在于如何存储SQLAlchemy
对象,而在于如何存储任何Object实例。
这是来自您导入的pymemcache Client
课程的docstring:
值必须有 str ()方法才能将自身转换为字节 字符串。
您还没有包含您正在查询数据库的Users
类的定义,所以我只能假设您没有覆盖__str__
。因此,当pymemcache
尝试将您的对象转换为字节字符串时,它会调用python的默认__str__
实现并存储它。
答案 1 :(得分:0)
正如@SuperShoot在回答中提到的那样,pymemcache
希望存储一个str
表示形式。由于您的SQLAlchemy模型实例(记录)本身不是str
表示形式,因此pymemcache
尝试调用其默认的__str__()
方法,这会产生不希望的结果。
您需要执行一个临时步骤,该步骤会将您的SQLAlchemy模型实例序列化为一种结构或另一种结构的str
。这使您的逻辑往返流程成为可能:
str
。str
存储序列化的pymemcache
。str
检索pymemcache
时,请将其反序列化为SQLAlchemy模型实例,以继续在Python代码中轻松使用它。这对于SQLAlchemy模型可能有点复杂,这就是为什么我建议使用SQLAthanor库的原因(全部披露:我是作者)。它使您可以将SQLAlchemy模型序列化为CSV,JSON或YAML-然后可以将其持久化到内存缓存。而且,它还使您可以轻松地将CSV,JSON或YAML字符串反序列化为SQLAlchemy模型实例,从而使您轻松维护上述整个流程。
该库有很多功能,您可以在文档页面上阅读:https://sqlathanor.readthedocs.io/en/latest/
要记住的重要一点是,在使用SQLAthanor时,您需要确定要以哪种格式存储数据(我建议使用JSON或YAML),然后显式配置要序列化的列/属性格式(这是库中的安全功能)。因为您的代码段显示您正在使用声明式反射,所以您可能需要查看文档的以下部分,以了解如何配置SQLAthanor:
希望这会有所帮助!