Python 在SQLAlchemy中保存和恢复查询
我正在基于用户完成的搜索构建查询,但只提取片段。在接下来的10分钟内,用户可能会请求下一个切片\页面,因此如果用户想要下一个切片,我想存储查询并还原它。理想情况下,我不希望从头开始构造查询,而是将其恢复到原来的状态,然后抓取下一个片段 我遇到了-->这似乎是针对这个用例的,但是当我试图在我的查询中运行它时,我遇到了一些问题 lib/python2.7/copy_reg.py”,第70行,在 raise TypeError,“无法pickle%s对象”%base.name TypeError:无法pickle函数对象 我怀疑这是由于在查询对象中使用函数导致的,但是我不确定问题到底出在哪里 你有没有关于如何推进这项工作的提示或建议?或者是一种替代方法 这是似乎要破坏它的代码Python 在SQLAlchemy中保存和恢复查询,python,sqlite,serialization,sqlalchemy,flask-sqlalchemy,Python,Sqlite,Serialization,Sqlalchemy,Flask Sqlalchemy,我正在基于用户完成的搜索构建查询,但只提取片段。在接下来的10分钟内,用户可能会请求下一个切片\页面,因此如果用户想要下一个切片,我想存储查询并还原它。理想情况下,我不希望从头开始构造查询,而是将其恢复到原来的状态,然后抓取下一个片段 我遇到了-->这似乎是针对这个用例的,但是当我试图在我的查询中运行它时,我遇到了一些问题 lib/python2.7/copy_reg.py”,第70行,在 raise TypeError,“无法pickle%s对象”%base.name TypeError:无法
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)
为了处理这个问题,我采取了不同的策略。相反,我将查询构建为字符串(作为ORM字符串,而不是SQL字符串)。然后存储查询,并根据需要使用eval()还原和执行查询
def page_query(query_string):
transaction_id = create_query_transaction(0, BLINKS_PAGE_SIZE, query_string)
return transaction_id
def next_page(transaction_id):
transaction = BlinkQueryTransaction.query.get(transaction_id)
query = eval(transaction.sql)
query = query.slice(transaction.latest_offset, transaction.page_size)
transaction.latest_offset = transaction.latest_offset + transaction.page_size
db.session.commit()
return query
def create_query_transaction(latest_offset, page_size, query):
bqt = BlinkQueryTransaction(latest_offset=latest_offset, page_size=page_size, sql=query)
bqt = save_to_db(bqt)
return bqt.id
我将查询字符串传递给page\u query(),然后根据需要使用next\u page()调用页面
def page_query(query_string):
transaction_id = create_query_transaction(0, BLINKS_PAGE_SIZE, query_string)
return transaction_id
def next_page(transaction_id):
transaction = BlinkQueryTransaction.query.get(transaction_id)
query = eval(transaction.sql)
query = query.slice(transaction.latest_offset, transaction.page_size)
transaction.latest_offset = transaction.latest_offset + transaction.page_size
db.session.commit()
return query
def create_query_transaction(latest_offset, page_size, query):
bqt = BlinkQueryTransaction(latest_offset=latest_offset, page_size=page_size, sql=query)
bqt = save_to_db(bqt)
return bqt.id
序列化程序中的一些错误已经修复,因此我建议尝试最新版本,以确保问题仍然存在。但是,对查询进行pickle处理非常困难。