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' }
ではコンソールからテーブルデータを確認します。
おや、自動インクリメントされるキーに1531549702197000
という謎の数値が入っています。
なんとなくDateっぽいので調べてみます。
> new Date(1531549702197) Sat Jul 14 2018 15:28:22 GMT+0900 (Japan Standard Time)
当たり。1000倍させられたDateさんでした。なんで1000倍されてるんだ。
なお、ドキュメントによるとこの値の型は64ビット符号長整数型だそうです。
まとめ
上の通り、TableStoreでは一般的なプログラミングでのインクリメントはされません。
ただただユニークで格納順に大きくなる値が入るだけです。
誤訳かと思うのですが、オプション名がAUTO_INCREMENT
なんですよね・・・