有人知道如何删除Google App Engine中的所有数据存储吗?
这就是你要找的东西...
db.delete(Entry.all(keys_only=True))
Route('/inventory/truncate', DataHandler, defaults={'_model':'Inventory', '_action':'truncate'})
这是处理程序:
class DataHandler(webapp2.RequestHandler):
@basic_auth
def delete(self, **defaults):
model = defaults.get('_model')
action = defaults.get('_action')
module = __import__('api.models', fromlist=[model])
model_instance = getattr(module, model)()
result = getattr(model_instance, action)()
首先,动态加载模型(即在api.models下找到的Inventory),然后根据action参数调用正确的方法(Inventory.truncate())。
@basic_auth是一个装饰器/封装器,为敏感操作(例如POST/DELETE)提供身份验证。如果您关心安全性,则还有一个oAuth装饰器可用。
最后,调用action:
def truncate(self):
db.delete(Inventory.all(keys_only=True))
看起来像魔法,但实际上非常简单。最好的部分是,delete()可以被重复使用,通过向模型添加另一个操作来处理删除一个或多个结果。
有关更多信息,请参见此图片:http://storage.googleapis.com/bnifsc/Screenshot%20from%202015-01-31%2023%3A58%3A41.png
您可以使用Web界面完成此操作。登录您的账户,在左侧链接中导航。在数据存储管理中,您有修改和删除数据的选项。使用相应的选项。
对于开发服务器,不要通过Google应用引擎启动器运行服务器,而是可以从终端运行:
dev_appserver.py --port=[端口号] --clear_datastore=yes [应用程序名称]
例如:我的应用程序“reader”在15080端口上运行。修改代码并重新启动服务器后,我只需运行“dev_appserver.py --port=15080 --clear_datastore=yes reader”。
这对我很有帮助。
如果你有大量的数据,使用网页界面可能会耗费很多时间。使用App Engine Launcher工具可以通过“Clear datastore on launch”复选框一次性删除所有内容。该工具现已适用于Windows和Mac(Python框架)。
关于最新进展的答案。
Google 最近添加了数据存储管理功能。您可以使用此控制台备份、删除或复制实体到另一个应用程序。
https://developers.google.com/appengine/docs/adminconsole/datastoreadmin#Deleting_Entities_in_Bulk
import (
"cloud.google.com/go/datastore"
"context"
"fmt"
"google.golang.org/api/option"
"log"
"strings"
"sync"
"time"
)
const (
batchSize = 10000 // number of keys to get in a single batch
deleteBatchSize = 500 // number of keys to delete in a single batch
projectID = "name-of-your-GCP-project"
serviceAccount = "path-to-sa-file"
table = "kind-to-delete"
)
func min(a, b int) int {
if a < b {
return a
}
return b
}
func deleteBatch(table string) int {
ctx := context.Background()
client, err := datastore.NewClient(ctx, projectID, option.WithCredentialsFile(serviceAccount))
if err != nil {
log.Fatalf("Failed to open client: %v", err)
}
defer client.Close()
query := datastore.NewQuery(table).KeysOnly().Limit(batchSize)
keys, err := client.GetAll(ctx, query, nil)
if err != nil {
fmt.Printf("%s Failed to get %d keys : %v\n", table, batchSize, err)
return -1
}
var wg sync.WaitGroup
for i := 0; i < len(keys); i += deleteBatchSize {
wg.Add(1)
go func(i int) {
batch := keys[i : i+min(len(keys)-i, deleteBatchSize)]
if err := client.DeleteMulti(ctx, batch); err != nil {
// not a big problem, we'll get them next time ;)
fmt.Printf("%s Failed to delete multi: %v", table, err)
}
wg.Done()
}(i)
}
wg.Wait()
return len(keys)
}
func main() {
var globalStartTime = time.Now()
fmt.Printf("Deleting \033[1m%s\033[0m\n", table)
for {
startTime := time.Now()
count := deleteBatch(table)
if count >= 0 {
rate := float64(count) / time.Since(startTime).Seconds()
fmt.Printf("Deleted %d keys from %s in %.2fs, rate %.2f keys/s\n", count, table, time.Since(startTime).Seconds(), rate)
if count == 0 {
fmt.Printf("%s is now clear.\n", table)
break
}
} else {
fmt.Printf("Retrying after short cooldown\n")
time.Sleep(10 * time.Second)
}
}
fmt.Printf("Total time taken %s.\n", time.Since(globalStartTime))
}
我经常不想删除所有数据存储,所以我从源代码控制中拉出 /war/WEB-INF/local_db.bin 的干净副本。也许只有我这样,但即使停止 Dev Mode,我似乎仍然需要在拉取之前物理删除该文件。这是在 Windows 上使用 Eclipse 的 Subversion 插件。
/path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/
,其中myappname是包含应用程序app.yaml文件的目录。您需要切换到此目录路径。 来源:Steven Almeroth和Melllvar的答案 - gsinha