Cloudant NoSQL DBへのデータの格納は、Cloudantダッシュボードからでも出来るが、1件1件入力しないとならないので手間がかかる。
csvなどからインポートすることは出来ないだろうか?
Cloudantダッシュボードからインポートをする方法がなかったのでネットで調べてみたら、それらしき投稿を見つけた。
少しわかりにくかったので、もう少し詳細に書いておこうと思う。
インポートの手順は、こんな感じ。
-
インポートデータを準備。
-
CloudFoundryサービスのCloudantの場合
2.1. curlで、APIにデータを送信。 -
IAMサービスのCloudantの場合
3.1. curlで、APIにトークン取得コマンドの送信。
3.2. curlで、APIにデータを送信。
JSONのお作法とか、コマンドのお作法とかいろいろあるのでその辺を詳しく解説する。
下準備
- curlを使うので、Windowsマシンならcurlのサイトでcurlをダウンロードしてくる。
- CloudantDBの資格情報の「url」と、IAMサービスのCloudantの場合「apikey」を調べる。
ここが役立つ
インポートデータの準備
インポートするデータはJSONで用意する。以下の例の初めの3行、後ろの2行は必ず必要となる。
3行目の "[" から後ろの2行目の "]" の間に書かれたオブジェクトが1オブジェクト1ドキュメントとしてDBに格納されていく。以下の例だと2ドキュメントがDBに格納される。
データに全角文字を含めることは可能だが、**文字コードは「UTF-8」**とする必要がある。
{
"type": "docs",
"docs": [
{ "item1": "hogehoge", "item2": "あいうえお"},
{ "item1": "hoge1234", "item2": "かきくけこ"}
]
}
CloudFoundryサービスのCloudantの場合
データを送信
作ったデータをAPIに送信する。
curlは作ったデータのファイルがあるディレクトリで実行する。
書式
curl -d @<ファイル名> <CloudantDBサービスの資格情報のurl>/<DB名>/_bulk_docs -H "Content-Type:application/json"
例
curl -d @data_utf8.json https://userid1234:password5678@hoge-bluemix.cloudant.com/hoge_db/_bulk_docs -H "Content-Type:application/json"
IAMサービスのCloudantの場合
IAMサービスの場合、トークンを取得して、そのトークンを使ってデータを送信する。
トークン取得コマンドの送信
トークン取得のコマンドをAPI送信する。
書式
実際には改行は入れず、一行にする。
curl -k -X POST --header "Content-Type: application/x-www-form-urlencoded"
--header "Accept: application/json"
--data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey"
--data-urlencode "apikey=<資格情報のapikeyの文字列(40文字ほどある)>"
"https://iam.bluemix.net/identity/token"
例
curl -k -X POST --header "Content-Type: application/x-www-form-urlencoded"
--header "Accept: application/json"
--data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey"
--data-urlencode "apikey=WRa....aWRw..9i"
"https://iam.bluemix.net/identity/token"
データを送信
作ったデータをAPIに送信する。
curlは作ったデータのファイルがあるディレクトリで実行する。
書式
実際には改行は入れず、一行にする。
curl --header "Authorization: Bearer <取得したtoken(1100文字ほどある)>"
--header "Accept: application/json"
-d @<ファイル名>
<CloudantDBサービスの資格情報のurl>/<DB名>/_bulk_docs
-H "Content-Type:application/json"
例
curl --header "Authorization: Bearer WQiOiIy...eyJraWQiOiIyMDE3MT"
--header "Accept: application/json"
-d @data_utf8.json
https://userid1234:password5678@hoge-bluemix.cloudant.com/hoge_db/_bulk_docs
-H "Content-Type:application/json"
おまけ
あくまでもcsvにこだわる人は、以下のサイトでcsvからJSONに変換できるので参考までに。
作成したJSONはそのままでは使えない。上記の例の初めの3行と最後の2行を付け加えることを忘れずに。