20.7 使用数据存储

    我们现在将对我们的例子进行一些扩展,制作一个问候结构,该结构可以包含问候的作者、内容和时间,我们要存储这些内容。这是你要做的第一件事:为你的程序实体(即你的程序所处理的对象)制作一个合适的数据结构,大多数情况下这将是一个 。在运行的程序中,这个结构的内存值将包含来自该实体的 DataStore 的数据。

    接下来我们程序的版本如下:

    ​ (A) url:/: 检索所有存储的问候语并通过 template 包显示它们

    ​ (B) url:/sign:存储一个新的问候语到数据存储里面

    我们现在需要导入 appengin/datastore 包:

    信号处理程序 (B) 从表单和上下文数据中构建了一个问候值 g,然后用 datastore.Put() 存储它。DataStore 在内部为数据记录生成自己的唯一 key;为了做到这一点,我们调用 函数,将

    作为第 2 个参数(这个函数需要实体 Greeting 的名字)。Put() 的第 3 个参数 &g 是一个包含 value 的 struct (严格来说,此处应为指向这个 struct 的指针)。

    datastore 包提供了一个查询类型,用于查询数据存储并迭代结果。根处理程序正是通过构造一个查询 来实现的,该查询按照日期降序从DataStore 中请求问候对象,限制为 10 个。

    我们需要一个数据结构来存储我们的查询结果,也就是 greetings,一个 Greeting 值的切片。我们对 q.GetAll(c, &greetings) 的调用检索了数据,并将它们存储在我们的切片中;当然,我们会检查可能的错误。

    当一切正常时,我们通过与我们的模板合并来显示数据:

    再次通过编辑 helloworld2.go 文件进行测试,用 listing 20.5 中的代码替换它;在问候中间的间隙关闭浏览器会话,这样你可以检查它们是否被持久保存。

    清除开发用服务器的数据存储:

    开发用 web 服务器使用一个本地版本的数据存储来测试你的应用程序,使用临时文件。只要临时文件存在,数据就会持续存在,除非你要求,否则 Web 服务器不会重置这些文件。如果你想让开发用服务器在启动前擦除其数据存储,请在启动服务器时使用 --clear_datastore 选项:

    调试:

    gdb 调试器可以和 Go 一起使用(见 http://golang.org/doc/debugging_with_gdb.html),你可以将 gdb 附加到一个现有的进程中。因此:像往常一样启动 dev_appserver.py,并访问 localhost:8080 来启动你的 Go 应用程序。然后执行: $ ps ax | grep _go_app,找到 _go_app 的 PID 和路径。如果你把 gdb 连接到这个上面,那么你对 dev_appserver 的下一个 HTTP 请求应该会碰到你在代码中设置的任何断点。记住,如果你修改了 Go 的源代码,那么开发应用服务器将重新编译并执行不同的 _go_app。