首页 > 编程问答 >在 GCP 数据存储上错误使用索引

在 GCP 数据存储上错误使用索引

时间:2024-07-23 06:23:53浏览次数:3  
标签:python google-cloud-platform google-cloud-datastore

我是数据存储的初学者,我遇到了索引问题,希望你们能帮忙解决。我正在使用名为 Program 的 google.cloud.nbd 模型,我想检查 contact_email 是否不为空,并且属性 claimer_digest_email_frequency 的值是否在值列表中。该 Python 代码如下所示:

matching_programs_keys = Program.query(
    Program.contact_email != None,
    Program.claimer_digest_email_frequency.IN(possible_values),
).fetch(keys_only=True)

尽管我已经在我正在使用的项目中对属性进行了索引,但我仍然遇到索引错误。有什么想法吗?我是否为该查询正确创建了索引?还有其他问题吗?

Google Cloud Datastore UI 中的索引

遇到错误


遇到的索引错误是因为数据存储区不支持使用“IN”运算符和不等式过滤器(如“!= None”)进行的查询。尽管已为属性创建了索引,但数据存储区无法将这些索引与尝试运行的特定查询结合使用。

要解决此问题,需要修改查询并确保它符合数据存储区索引规则。以下是一些选项:

选项 1:使用多个查询并合并结果

可以将查询拆分为多个查询,每个查询检查“claimer_digest_email_frequency”的一个值,然后合并结果:

matching_programs_keys = []
for value in possible_values:
    keys = Program.query(
        Program.contact_email != None,
        Program.claimer_digest_email_frequency == value
    ).fetch(keys_only=True)
    matching_programs_keys.extend(keys)

此方法将为每个“possible_values”执行单独的查询,并使用“==”运算符,这受数据存储区索引支持。

选项 2:使用不等式过滤器对“claimer_digest_email_frequency”进行建模

如果“possible_values”的列表很小且值范围有限,则可以考虑使用不等式过滤器重构数据模型。例如,如果“possible_values”是频率范围,则可以使用“claimer_digest_email_frequency_min”和“claimer_digest_email_frequency_max”属性。然后,的查询将如下所示:

matching_programs_keys = Program.query(
    Program.contact_email != None,
    Program.claimer_digest_email_frequency_min <= max(possible_values),
    Program.claimer_digest_email_frequency_max >= min(possible_values)
).fetch(keys_only=True)

此方法需要更改数据模型,但它允许使用单个查询来检索所需的结果。

选项 3:如果合适,使用 Firestore

如果的应用程序需要更复杂的查询功能并且数据存储区索引限制过于严格,则可以考虑使用 Cloud Firestore 作为数据库。Firestore 支持更广泛的查询运算符和索引选项,包括“IN”运算符和不等式过滤器组合。

请记住,在更改数据模型或选择其他数据库技术之前,请仔细评估每个选项的权衡。

标签:python,google-cloud-platform,google-cloud-datastore
From: 78780912

相关文章

  • AWS Elastic Beanstalk chown PythonPath 错误
    我正在AWS的elasticbeanstalk上部署一个Web应用程序,遇到了同样的错误:[StageApplication].Stoprunningthecommand.Error:chown/var/app/staging/venv/bin/python:nosuchfileordirectory.我在我的环境配置中看到属性:PYTHONPATH:/var/......
  • Python:支持索引的内存对象数据库?
    我正在做一些数据整理,如果我可以将一堆字典放入内存数据库中,然后对其运行简单的查询,这会简单得多。例如,类似:people=db([{"name":"Joe","age":16},{"name":"Jane","favourite_color":"red"},])over_16=db.filter(age__g......
  • 如何构建一维数组的二维数组的特定 Python 结构?
    如何构建一维数组(即行向量)的二维数组的特定结构以满足特定我正在维护的遗留程序的结构?我可以在此结构中生成正确的内容all_measurements[:12]array([[0.,0.,0.,2.],[0.02,0.334,0.04,2.24],[0.04,0.668,0.08,2.48],...........
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......