レコードに値がなかったら登録、あったら更新する UPSERT

著者名: 後迫 孝 (External link) (サイボウズ株式会社)

目次

はじめに

基幹システムの商品、顧客マスターをkintoneで作った「受発注」や「顧客案件管理」アプリに定期的に、更新したいケースはありませんか?
たとえば、顧客マスターの場合にすでに登録済の顧客情報は更新して、新しいの顧客情報は登録したくなります。

kintone REST APIでは、レコード登録API、レコード更新APIがあるので、それらを組み合わせることで実現できます。
kintoneのレコードのキーになる値がない場合には登録して、値がある場合には更新するといったように組み合わせた方法を紹介します。

データベースでいうと「SELECTUPDATE or INSERT」です。

組み合わせる API

データを作る

まず、次のようにkintoneアプリにレコードを用意しましょう。

フィールドコード 企業コード 企業名 従業員数
C1001 ▲商事 1000

キー項目の値と一致するか調べる

HTTPのクエリ文字列でリクエストしてみます。

1
2
3
GET /k/v1/records.json?app=77&query=code="C1001"&fields=code  HTTP/1.1
Host: {sub-domain}.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
  • リクエストするクエリ文字列(&query=以降)はURLエンコードしてください。
  • X-Cybozu-Authorizationのパラメーター値は、ログイン名+「:」+パスワードをBASE64でエンコードしたものになります。

レスポンスには次の文字列が返ってきました。(一部を表示しています)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
    "records": [
        {
            "record_id": {
                "type": "RECORD_NUMBER",
                "value": "1"
            },
            "企業コード": {
                "type": "SINGLE_LINE_TEXT",
                "value": "C1001"
            },
            "企業名": {
                "type": "SINGLE_LINE_TEXT",
                "value": "▲商事"
            },
            ・・・
        }
    ]
}

値があったら更新してみる

値があるとidを取得できます。

1
2
3
4
PUT /k/v1/records.json? HTTP/1.1
Host: {sub-domain}.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
Content-Type: application/json
  • X-Cybozu-Authorizationのパラメーター値は、ログイン名+「:」+パスワードをBASE64でエンコードしたものになります。
  • リクエストボディには、JSON形式の文字列になるので、Content-Typeを指定します。

リクエストボディの内容です。

1
2
3
4
5
6
7
8
9
{
    "app": 10,
    "id": 1,
    "record": {
        "企業名": {
            "value": "●商事"
        }
    }
}

値がなかったら登録してみる

企業コードに「1002」を指定してレコード取得してみましょう。

https://{sub-domain}.cybozu.com/k/v1/records.json?app=77&query=code="C1002"&fields=code

その結果、レスポンスには次のような文字列が返ってきました。
これは、値がなかったことを意味します。

1
{}

値がないことを確認したので、レコードを登録してみます。

1
2
3
4
POST /k/v1/records.json? HTTP/1.1
Host: {sub-domain}.cybozu.com:443
X-Cybozu-Authorization: QWRtaW5pc3RyYXRvcjpjeWJvenU=
Content-Type: application/json
  • X-Cybozu-Authorizationのパラメーター値は、ログイン名+「:」+パスワードをBASE64でエンコードしたものになります。
  • リクエストボディには、JSON形式の文字列になるので、Content-Typeを指定します。

リクエストボディの内容です。

1
2
3
4
5
6
7
8
{
    "app": 10,
    "record": {
        "企業名": {
            "value": "□商事"
        }
    }
}

POSTに成功しますと、revisionはレコード単位で保有しているリビジョン番号になります。

1
2
3
4
{
    "id": "11",
    "revision": "1"
}

おわりに

このように、レコード取得、レコード更新・登録APIを利用して、UPDATE or INSERTを実現できます。
ぜひお試しください。

information

このTipsは、2014年4月版kintoneで動作を確認しています。