レコードに値がなかったら登録、あったら更新する 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 で動作を確認しています。