无需Python 2.7,如何删除含GAE搜索数据的Datastore数据库?
解决默认Datastore因遗留GAE搜索数据无法删除的问题
问题重现
尝试删除(default) Datastore数据库时触发报错:
400: Database contains Google App Engine search data.
To delete this database you must first remove the search data.
该数据为多年前Python 2.7 AppEngine项目遗留的13.4KB无用内容,控制台无删除入口,官方提供的删除代码依赖已卸载的Python2.7,更换项目或非默认数据库不可行(会丢失免费额度、需修改代码),且阻碍gcloud alpha firestore backups灾备操作。尝试用appengine-python-standard适配Flask访问Search API时,遭遇RPCFailedError: Attempted RPC call without active security ticket,本地操作有效性存疑。
可行解决方案
方法1:临时Python2.7虚拟环境操作
无需全局安装Python2.7,用虚拟环境隔离执行:
- 用pyenv安装并切换到Python2.7.18:
pyenv install 2.7.18 pyenv local 2.7.18 virtualenv venv source venv/bin/activate - 安装GAE SDK依赖:
pip install google-appengine - 编写删除脚本
delete_search_data.py:from google.appengine.api import search import os os.environ['GOOGLE_CLOUD_PROJECT'] = "你的项目ID" # 遍历所有索引并删除文档及索引 for index in search.Index.get_indexes(): # 批量删除文档 while True: docs = index.get_range(ids_only=True) if not docs: break index.delete([doc.doc_id for doc in docs]) # 删除索引本身 index.delete() - 执行脚本:
python delete_search_data.py - 清理环境:
deactivate pyenv local --unset
方法2:Cloud Functions(Python3.x环境)
利用云端环境无需本地Python2.7:
- 在Cloud Console创建Python 3.x的HTTP触发型Cloud Function
- 主函数代码:
import google.cloud.search_v1 as search def delete_legacy_search_data(request): client = search.IndexServiceClient() project_id = "你的项目ID" project_path = client.project_path(project_id) # 列出所有索引 indexes = client.list_indexes(project_path) for index in indexes: # 循环删除所有文档 while True: doc_list = client.list_documents(index.name, ids_only=True) doc_ids = [doc.doc_id for doc in doc_list] if not doc_ids: break client.delete_documents(index.name, doc_ids) # 删除索引 client.delete_index(index.name) return "Legacy search data deleted successfully" requirements.txt添加依赖:google-cloud-search>=2.0.0- 部署后触发函数执行,完成后可删除该函数
方法3:提交Cloud支持工单
若上述方法无效,直接通过Cloud Console提交支持工单,说明是遗留Python2.7 GAE搜索数据导致无法删除Datastore,请求官方协助清理。
内容的提问来源于stack exchange,提问作者neurino
相关产品推荐
相关产品推荐

