TableStoreで自動インクリメントする

Alibaba CloudのTableStoreのAUTO_INCREMENTオプションを使って自動インクリメントするようにします。

nodejsで自動インクリメントするプライマリキーを持ったテーブルを作成します。

const TableStore = require('tablestore')

const instanceName = 'teststorage'
const tableName = 'test'

const client = new TableStore.Client({
  accessKeyId: "xxxxxxxxxxxxxxxxxxxxx",
  secretAccessKey: "xxxxxxxxxxxxxxxxxxxxxxxxxx",
  endpoint: `https://${instanceName}.cn-hangzhou.ots.aliyuncs.com`,
  instancename: instanceName,
})

const params = {
  tableMeta: {
    tableName: 'autoIncTable',
    primaryKey: [
      {
        name: 'integerPK',
        type: 'INTEGER'
      },
      {
        name: 'autoIncPK',
        type: 'INTEGER',
        option: 'AUTO_INCREMENT' // ここ大事!
      },
    ]
  },
  reservedThroughput: {
    capacityUnit: {
      read: 0,
      write: 0
    }
  },
  tableOptions: {
    timeToLive: -1,
    maxVersions: 1
  }
}

client.createTable(params, (err, data) => {
  if (err) {
    console.log('error:', err)
    return
  }
  console.log('success:', data)
})

自動インクリメントするためにはINTEGERのプライマリキーにオプションとしてoption: ‘AUTO_INCREMENT’を設定する必要があります。

$  node table_store/createTable.js
success: { RequestId: '00000000-0000-0000-0000-000000000000' }

公式ドキュメントは以下です。 jp.alibabacloud.com

公式のサンプルコードのここにAUTO_INCREMENTの指定が書かれています。 aliyun-tablestore-nodejs-sdk/primarykey.js at 8a9f0ab8c520874d3177afe97c193776dca80747 · aliyun/aliyun-tablestore-nodejs-sdk · GitHub

挿入する

さて、では実際に値を挿入してみましょう。まずnodejsのコードから値を挿入します。

const TableStore = require('tablestore')
const Long = TableStore.Long;
const instanceName = 'teststorage'

const client = new TableStore.Client({
  accessKeyId: "xxxxxxxxxxxxxxxxxxxxxxx",
  secretAccessKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  endpoint: `https://${instanceName}.cn-hangzhou.ots.aliyuncs.com`,
  instancename: instanceName,
})

const params = {
  tableName: 'autoIncTable2',
  condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
  primaryKey: [{ 'integerPK': Long.fromNumber(3) }, { 'autoIncPK': TableStore.PK_AUTO_INCR }],
  attributeColumns: [
    { 'www': Long.fromNumber(3) },
  ],
  returnContent: { returnType: TableStore.ReturnType.Primarykey }
}

client.putRow(params, (err, data) => {
  if (err) {
    console.log('error:', err)
    return
  }
  console.log('success:', data)
})

自動インクリメントするキーの値にTableStore.PK_AUTO_INCRを指定すればあとは勝手にやってくれます。

$ node createRow.js
success: { consumed: { capacity_unit: { read: 0, write: 1 } },
  row: { primaryKey: [ [Object], [Object] ], attributes: [] },
  RequestId: '000570ef-9c43-79d4-5576-d80b5c87e550' }

ではコンソールからテーブルデータを確認します。

f:id:asmsuechan:20180714154149p:plain

おや、自動インクリメントされるキーに1531549702197000という謎の数値が入っています。

なんとなくDateっぽいので調べてみます。

> new Date(1531549702197)
Sat Jul 14 2018 15:28:22 GMT+0900 (Japan Standard Time)

当たり。1000倍させられたDateさんでした。なんで1000倍されてるんだ。

なお、ドキュメントによるとこの値の型は64ビット符号長整数型だそうです。

まとめ

上の通り、TableStoreでは一般的なプログラミングでのインクリメントはされません。

ただただユニークで格納順に大きくなる値が入るだけです。

誤訳かと思うのですが、オプション名がAUTO_INCREMENTなんですよね・・・