twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル エンタープライズ クラウド ストレージ入門その 2: Cloudant データベースへのアクセス方法

エンタープライズ クラウド ストレージ入門その 2: Cloudant データベースへのアクセス方法

原文はこちらです。
 
以前の文献 (訳注: 本文はここ、和訳はここ) で、Cloudant データベースにおいてアカウントの作成、データベースの作成、そして新規ドキュメントの作成方法を説明しました。ここでは、データベースにプログラムからアクセスする方法を学びます。そのために、使用する言語に応じた CouchDB ドライバーが必要です。ここでは、node.js を使い、nano ドライバーを用います。他の言語でも考え方は同じです。
 
Cloudant は、文書を JSON オブジェクトとして扱います。node.js は JavaScript を使用するので、これらの文書を Coudant と node.js プログラム間で簡単に交換できます。最近作成した文書を使用します。このためには、Cloudanto のログイン名、データベース名と、文書の _id が必要です。私のデータベースでは、_id は 'd795ad9029793255261aba9fe045ac4f' ですが、読者のデータベースでは異なるでしょう。Cloundant ウェッブ コンソールを使用して見つけることができます。フィールド名は _id です。
 
以下に、文書処理、印刷の node.js アプリケーションを示します。ログイン情報、データベース名、_id は、自分自身のものと置き換えてください。もちろん、username/password も、Cloudant ウェッブ コンソールで使用しているものを使ってください。
var nano = require('nano')({
    url: 'https://username:password@username.cloudant.com'
});
nano.use('linux_com_demo').get(
'd795ad9029793255261aba9fe045ac4f', function(err, doc) {
    console.log(doc);
});

“Cannot find module 'nano'” というエラー メッセージが出たら、npm で nano をインストールしたことを確認し、それが node モジュール パスで参照できることを確認してください。

 
実行すると、コンソール上に文書全体が表示されます。
{ _id: 'd795ad9029793255261aba9fe045ac4f',
  _rev: '3-7b7ebadc7043829cb0499a6ed70a4b9a',
  first_name: 'George',
  last_name: 'Washington',
  lived: { born: 1732, died: 1799 },
  president: 1 }

これは、少々単純です。nano.use を呼び出して、データベースにアクセスします。文書を処理するオブジェクトを戻します。

エラー処理が必要ですね。今のままでは、文書が見つからなくても、何の例外も起きません。文書が ”undefined” 値を持つだけです。コールバック関数の第一引数として、完全なエラー情報を貰えます。_id を存在しない値に設定し、エラー メッセージを見てみます。次のようにコールバック関数を書き換えます。
if (err) {
    console.log(err);
    return;
}
console.log(doc);

紙面の都合で、すべてのエラー オブジェクトを紹介することはできません。しかし、オブジェクトは複数のメンバーから構成されています。たとえば、以下のようになっています。

{
  name: 'Error',
  status_code: 404,
  'status-code': 404,
  error: 'not_found',
  reason: 'missing'
}

メンバーによりエラー内容が良くわかります。

文書のアップロード

次に、文書をアップロードしましょう。CouchDB (以下 Cloudant と呼びます) は、文書にリビジョン番号をつけて管理しているので、少しトリッキーなことをします。
 
まず、文書のアップロードは簡単です。先の例とは独立した 1 つのプログラムです。
var nano = require('nano')({
    url: 'https://username:password@username.cloudant.com'
});
var mydoc = {
    first_name: 'John',
    last_name: 'Adams',
    lived: { born: 1735, died: 1826 },
    president: 2
};
nano.use('linux_com_demo').insert(mydoc, function(err, doc) {
    if (err) {
        console.log(err);
        return;
    }
    console.log(doc);
});

実行結果です。

{ ok: true,
  id: 'b6fa8c64f64dbfdd40631b5ad7b922b2',
  rev: '1-e03edf9c7815a64cc1df4063d9a2fd6b' }

オリジナルのオブジェクトに id を付与していないため、Cloudant が _id を割り付けて、レスポンスの id フィールドに設定しました。レスポンス内のフィールド名が下線を含まない id であることに注意してください。必要ならば、Cloudant が割付けた _id の代わりに自分たちの _id を割り付けることができます。実際のアプリケーションでは、レスポンス内の id と rev を文書の _id と _rev として使用すると、アプリケーション内で文書を使用するのに便利でしょう。

ウェッブ コンソールで、ドキュメントを見てみましょう。ログインして、データベース名をクリックします。文書の現在のリストが表示されます。以前のチュートリアルで作成した文書と今回作成した文書が表示されています。下図にスクリーン ショットを載せます。
 
cloudant doclist
 
ここでは、各文書の簡単な説明しか表示されていません。マウスを文書上に動かすと、”Edit doc” ボタンが表示されます。クリックし、文書を表示させます。
cloudant document

ドキュメント リビジョン

_rev について説明しましょう。これは、文書のリビジョン番号です。データベース内に既に存在する _id を持つ文書を書く時には、原稿リビジョン番号が必要となります。さもないと、文書はリジェクトされ、エラーとなります。エラー メッセージは、コード 409、メッセージは ”Document update conflict” です。基本は簡単です。既にある文書を編集する時は、_rev フィールドに注意を払い、アップロードする時に必ずそれを使うようにします。文書を格納するときは、新しい _rev を使って、文書の順序性を確保するのです。
 
複数人で作業する場合、この方法には問題があります。ある人が文書を処理して格納する間に、他の人が変更した内容を上書きしたい時があります。ちょっとしたワークアラウンドがあります。文書を一時文書として読み出し、_rev を変更した一時文書を実際の文書にコピー、保存します。しかし、この処理の間に、他の人が文書を保存する可能性もあります。その場合、エラーが発生するので、もう一度処理します。しかしこのようなことは、不注意なエンジニアが作業する時くらいです。できるだけ _rev フィールドの内容を追跡できるようにしておきます。

最後に

本チュートリアルでは、Cloundant にアクセスするコードの書き方について簡単に触れました。書き方は簡単です。Cloudant のドキュメントには、ビューの作成方法やテキスト検索など、他のたくさんのトピックがあります。将来取り上げるつもりです。
 
最後に、今回のチュートリアルで説明したコーディングの考え方は、Cloudant 独自のものではないことを強調しておきたいと思います。個人がローカルにインストールしたデータベースをはじめとする他の CouchDB データベースにも、同様の手法を適用できます。つまり、ローカルでテストができますが、テキスト検索とインデックス機能は、ローカル インストールには含まれません。しかし、作成、読み出し、更新、削除、ビューなどの一般機能はインストールされます。Cloudant を使い始めたら、自分たちで独自サーバーを管理する手間が不要なリプリケーション機能を使うようになるでしょう。中小規模の限られた資源しかない企業では、データベース管理に資源を取られることなく製品開発に力を注げます。
Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/04/16 2018年 4月 15日
  2. Today's Linux 2018/04/19 2018年 4月 18日
  3. Today's Linux 2018/04/17 2018年 4月 17日
  4. Today's Linux 2018/04/20 2018年 4月 19日
  5. Today's Linux 2018/04/23 2018年 4月 22日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!