gpt4 book ai didi

python - 在 flask-SQLAlchemy 中保存和恢复查询

转载 作者:行者123 更新时间:2023-12-05 07:59:50 26 4
gpt4 key购买 nike

我正在根据用户进行的搜索构建查询,但只提取切片。在接下来的 10 分钟内,用户可能会请求下一个切片\页面,所以如果用户想要下一个切片,我想存储查询并恢复它。理想情况下,我不希望从头开始构建查询,而是将其恢复到原来的状态,然后获取下一个片段。

我遇到过 --> http://docs.sqlalchemy.org/en/rel_0_8/core/serializer.html这似乎是针对这个用例的,但是当我尝试在我的查询中运行它时,我遇到了问题。

lib/python2.7/copy_reg.py", line 70, in _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)

最佳答案

为了处理这个问题,我采取了不同的策略。相反,我将查询构建为字符串(作为 ORM 字符串,而不是 SQL 字符串)。然后我存储查询,并根据需要使用 eval() 恢复和执行它。

我将查询字符串传递给 page_query(),然后根据需要使用 next_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

关于python - 在 flask-SQLAlchemy 中保存和恢复查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20622145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com