开发学院数据库MySQL 针对PHP开发人员的CouchDB基础知识 阅读

针对PHP开发人员的CouchDB基础知识

 2010-10-06 20:43:22 来源:WEB开发网   
核心提示: 清单 3. 获得数据库信息try { $info = $client->getDatabaseInfos();} catch (Exception $e) { echo "Error:".$e->getMessage()." (errcode=".$e->ge

 清单 3. 获得数据库信息

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

 清单 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. 从数据库中检索一首歌

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. 检索到的歌曲

				
stdClass Object
(
    [_id] => whatever_you_like
    [_rev] => 1-1d915e4c209a2e47e5cf05594f9f951b
    [title] => Whatever You Like
    [artist] => T.I.
    [album] => Paper Trail
)

            

 清单 7. 更新一个文档
				
$doc->genre = 'hip-hop';
$doc->year = 2008;
try {
        $response = $client->storeDoc($doc);
} catch (Exception $e) {
        echo "Error: ".$e->getMessage()." (errcode=".$e->getCode().")\n";
        exit(1);
}
            

 清单 8. 更新后的文档
				
stdClass Object
(
    [_id] => whatever_you_like
    [_rev] => 2-12513a362693b300928aa45f82faed83
    [title] => Whatever You Like
    [artist] => T.I.
    [album] => Paper Trail
    [genre] => hip-hop
    [year] => 2008
)
            

 清单 9. 创建一个新文档
				
$song = new stdClass();
$song->_id = "in_the_meantime";
$song->title = "In the Meantime";
$song->album = "Resident Alien";
$song->artist = "Space Hog";
$song->genre = "Alternative";
$song->year = 1995;

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

 清单 10. 创建一个新文档的结果
				
stdClass Object
(
    [ok] => 1
    [id] => in_the_meantime
    [rev] => 1-d65b03a9fe2f3c8095b08883e7cd97df
)

使用 CouchDB API

在进入 PHP 之前,最好是先对 CouchDB API 有些了解,此 API 可通过 HTTP GET 和 PUT 请求访问并返回 JSON 格式的数据。不管您使用的是何种语言 — PHP、Microsoft Active Server Pages (ASP)、Ruby、Python 或更为简单的 jQuery Ajax 函数,这种设置都会使从 Web 应用程序存储和检索数据得到简化。

本节展示如何使用这个 cURL 命令行工具向 CouchDB 发出 GET、POST、PUT 和 DELETE 请求。掌握了这个 API 之后,就可以借助一个特别的 PHP 包装器简化开发任务。

您首先需要运行的(仍然是从 Terminal 窗口)是这个命令:curl http://127.0.0.1:5984/。随后,应该会得到类似于 {"couchdb":"Welcome","version":"0.10.0"} 的一个响应。这只是为了告诉您 CouchDB 已经启动并运行以及所使用的是何版本。如果您没有看到这个消息,那么就请重新进行安装和配置直至 CouchDB 启动并运行。

现在,尝试列出在 CouchDB 内设置的所有集合。运行 curl -X GET http://127.0.0.1:5984/_all_dbs。

如果 CouchDB 是初次安装,应该会看到响应 [],这意味着没有任何集合或数据库(方括号代表的是一个空的 JavaScript 数组)。请注意在这个 cURL 命令中,使用了 -X 选项来显式指定一个 GET 操作。

现在,让我们通过创建一个数据库来解决该问题:

curl -X PUT http://127.0.0.1:5984/songs
      


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

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

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


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

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

curl -X PUT http://127.0.0.1:5984/foobar
      


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

curl -X DELETE http://127.0.0.1:5984/foobar
      


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

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

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


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

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

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

curl -X PUT http://localhost: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 http://localhost: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 项。单击该链接会显示所感兴趣的这个文档的详细信息,

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

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


 

1 2 3  下一页

Tags:针对 PHP 开发

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接