【发布时间】:2013-12-16 22:22:14
【问题描述】:
我正在根据用户完成的搜索构建查询,但只提取切片。在接下来的 10 分钟内,用户可能会请求下一个切片\页面,所以如果用户想要下一个切片,我想存储查询并恢复它。理想情况下,我不希望从头开始构建查询,而是将其恢复到原来的状态,然后抓取下一个切片。
我遇到过 --> http://docs.sqlalchemy.org/en/rel_0_8/core/serializer.html 这似乎是针对这个用例的,但是当我尝试在我的查询上运行它时,我遇到了问题。
lib/python2.7/copy_reg.py",第 70 行,在 _reduce_ex 中 raise TypeError, "can't pickle %s objects" % base.name TypeError: can't pickle function objects
我怀疑这是由于 flask-SQLAlchemy 在查询对象中使用了函数,但是我不确定问题出在哪里。
您对如何推进这项工作有什么提示或建议?或者也许是另一种方法。
这是似乎破坏它的代码。
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.orm import relationship
from sqlalchemy.ext.serializer import loads, dumps
from sqlalchemy import Table, Column, Integer, ForeignKey
db = SQLAlchemy(app)
class Blink(db.Model):
id = db.Column(db.Integer, primary_key=True)
uploaded_sd = db.Column(db.Boolean, default=False, index=True)
blink_metadata = relationship("BlinkMetadata", remote_side='BlinkMetadata.blink_id',
primaryjoin='blink.c.id==blink_metadata.c.blink_id')
class BlinkMetadata(db.Model):
id = db.Column(db.Integer, primary_key=True)
blink_id = db.Column(db.Integer, ForeignKey('blink.id'), index=True)
metadata_id = db.Column(db.Integer, index=True)
metadata_type_id = db.Column(db.Integer)
created_date = db.Column(db.DateTime)
last_updated = db.Column(db.DateTime)
blink = relationship("Blink", remote_side='Blink.id',
primaryjoin=('blink_metadata.c.blink_id==blink.c.id'))
def make_sample_query():
q = db.session.query(Blink).filter(Blink.uploaded_sd == 1)
activity_filter = (
(BlinkMetadata.metadata_id == 1) &
(BlinkMetadata.metadata_type_id == 1)
)
q = q.join(Blink.blink_metadata, aliased=True).filter(activity_filter)
serialised_query = dumps(q)
【问题讨论】:
-
序列化程序中的一些错误已得到修复,因此我建议尝试最新版本以确保问题仍然存在。但是,是的,腌制查询非常困难。
标签: python sqlite serialization sqlalchemy flask-sqlalchemy