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。