热门技术教程

面向PHP开发人员的CouchDB基础知识(2)


次阅读 | 2011-09-27 | 标签:

在运行上述命令后,会得到响应 {"ok":true}。现在您知道您可以查看 ok 属性来确认成功与否。再次运行 curl -X GET :5984/_all_dbs,结果会得到一个非空数组:["songs"]。并且,您的 CouchDB 实例内具有这样一个数据库:songs。

现在尝试创建另一个名为 songs 的数据库。如果您再次运行 curl -X PUT :5984/songs ,将会获得一个如下所示的错误消息:

{"error":"file_exists","reason":"The database could not be created, the file already exists."}

所以您可以很容易地查看 error 属性来确认问题发生与否。

创建第二个名为 foobar 的数据库:

curl -X PUT :5984/foobar

如果运行 curl -X GET :5984/_all_dbs,结果会获得响应 ["songs","foobar"]。为了去掉第二个数据库,可以向它传递一个 DELETE 调用:

curl -X DELETE :5984/foobar

运行 curl -X GET :5984/_all_dbs 表示您已经回至 ["songs"]。

现在继续,在 songs 数据库内创建一些文档。毋庸置疑,您想要在这个数据库内存储一些歌曲,这些歌曲具有曲名、艺人名称和专辑名称字段。要创建一个文档,遵循如下这个模式:

curl -X PUT :5984/songs/*id* -d '{ *json_data* }'

注意到先是调用数据库的名称,随后是 ID(要求 ID 不仅要在这个 CouchDB 实例中惟一,而且还要尽量在所有实例中惟一),再后来是 JSON 数据。

如何获得惟一 ID?可以使用一个 UUID(或一个 GUID)作为惟一 ID,或者也可以创建某种综合了各种小块数据的自然键(比如,歌曲名中用下划线代替空格,再加上时间戳),或者是让 CouchDB 为您创建一个惟一 ID (这个过程很慢)。上述方式都不错,只是不要像在 MySQL 环境内那样使用自动增量的值。

现在,向您的数据库内输入一首歌曲:

curl -X PUT :5984/songs/whatever_you_like -d \ '{"title":"Whatever You Like", "artist":"T.I.","album":"Paper Trail"}' {"ok":true,"id":"whatever_you_like","rev":"1-1d915e4c209a2e47e5cf05594f9f951b"}

请注意我对这个惟一 ID 采用了一个十分简单的方式(使用了一个简化了的歌曲名称,用下划线代替了空格)。这种简单的方式对于目前的需要还能满足。幸运的是,在 PHP 内将要使用的包装器会帮助您创建更好的 ID。也请注意我立即收到了一个 “ok” 响应,并且其中的文档 ID 和 rev 属性还告知了所设置的修订版本。

要查看刚刚添加的这个文档,可以尝试:

curl -X GET :5984/songs/whatever_you_like {"_id":"whatever_you_like","_rev":"1-1d915e4c209a2e47e5cf05594f9f951b", "title":"Whatever You Like", "artist":"T.I.", "album":"Paper Trail"}

如果您一直在 Futon 内尝试,应该能够单击这个歌曲数据库名并在文档列表内看到一个 whatever_you_like 项。单击该链接会显示所感兴趣的这个文档的详细信息,如图 2 所示。


图 2. 文档详细信息

一个歌曲项的屏幕快照,显示了所有填充了的字段

您逐渐发觉 — 用 JSON 做出 RESTful 请求后就会有事情发生。

现在,所有这些看上去都很好,但是如果您是一名 PHP 开发人员,可能会疑惑如何将这些综合在一起形成自己熟悉的东西呢。下一节会向您介绍面向 CouchDB 的 PHP 包装器。

使用 PHP

对于下一个步骤,您需要从 Github 下载 PHP-on-Couch(参见 )。将解压缩了的 /lib 文件夹内容放入您的开发区域。在设置好工作区域后,创建一个简单的 PHP 应用程序来与已经设置好的这个 CouchDB 数据库(您的歌曲集)对话。创建一个新文件,然后将其命名为 index.php。并在其内放入清单 2 内的代码。


清单 2. CouchDB 连接设置
 

<?php $couch_dsn = ":5984/"; $couch_db = "songs"; require_once "./lib/couch.php"; require_once "./lib/couchClient.php"; require_once "./lib/couchDocument.php"; $client = new couchClient($couch_dsn,$couch_db); ?>

上述代码充当的是到 CouchDB 的连接代码并且包含使用此数据库所需的所有相关类。接着列出与数据库相关的全部信息,如清单 3 所示。


清单 3. 获得数据库信息
 

try { $info = $client->getDatabaseInfos(); } catch (Exception $e) { echo "Error:".$e->getMessage()." (errcode=".$e->getCode().")\n"; exit(1); } print_r($info);

得到的结果应该类似于清单 4。


清单 4. 数据库信息
 

stdClass Object ( [db_name] => songs [doc_count] => 2 [doc_del_count] => 0 [update_seq] => 2 [purge_seq] => 0 [compact_running] => [disk_size] => 8281 [instance_start_time] => 1266082749089965 [disk_format_version] => 4 )

接下来,从歌曲数据库中检索一个文档。清单 5 给出了所需代码。


清单 5. 从数据库中检索一首歌
 

try { $doc = $client->getDoc('whatever_you_like'); } catch (Exception $e) { if ( $e->code() == 404 ) { echo "Document not found\n"; } else { echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")\n"; } exit(1); } print_r($doc);

清单 6 给出了响应。


清单 6. 检索到的歌曲
 

stdClass Object ( [_id] => whatever_you_like [_rev] => 1-1d915e4c209a2e47e5cf05594f9f951b [title] => Whatever You Like [artist] => T.I. [album] => Paper Trail )
上一篇:使用参数化查询防止SQL注入漏洞    下一篇:未来5年程序员应当具备的十项技能