次のようなエラーを対処する。
message: 'A 400 Bad Request error occurred: {"error":"partial write: field type conflict: input field "data" on measurement "test" is type float, already exists as type integer dropped=1"}\n'
integer
として登録されているデータが float
で送られてきたため400のコードが帰っている。
このメッセージに騙されて汎ゆる手法でdata
をinteger
に変換しようとしてしまうが、そもそJavaScriptには明示的にinteger
とfloat
を分けるコードはない(number
という型になる)
次のInfluxQLを実行してFieldsの型を確認する。
今回は"test_db"というDB名である。
SHOW FIELD KEYS ON "test_db"
Chronografで表示
画像の通り data
は integer
である。
次のコードでデータ登録を試みる。
import Influx from 'influx'
const influx = new Influx.InfluxDB({
host: 'localhost',
database: 'test_db',
})
influx.writePoints([
{
measurement: 'test',
fields: {
data: 9999,
},
tags: []
}
]).then((data) => {
console.log(data)
}).catch((err) => {
console.log(err)
})
JS的には何も問題ない。
node-influxとしても正しいコードだ。
9999
は整数であるためinteger
という認識で問題ない。
実はこのエラーinteger
やfloat
は関係なく冒頭でInfluxDBをnew
しているコードに不備があるため発生する。
正しくは次のように宣言しなければならない。
const influx = new Influx.InfluxDB({
host: 'localhost',
database: 'test_db',
schema: [
{
measurement: 'test',
fields: {
data: Influx.FieldType.INTEGER,
},
tags: []
}
]
})
つまりJavaScriptとしてinteger
を定義するのではなくInfluxDBのインスタンスを生成するときにschema
(スキーマ)を明示するのである。
これならば正しく登録される。
このエラーはDBに既にfields
がinteger
で登録してある場合にのみ発生する。初めからスキーマを設定せずにdata:9999
を登録すると自動でfloat
で登録されるようで型指定エラーには出会わなくなる。
海外のフォーラムではinteger
はもともと使わないほうが良いという声もあったが小数点以下を使用しないならinteger
で絞りたいのはエンジニア的思考である。
デフォルトより明示的に指定したほうが良いと私は考えている。
DBにデータを登録するコードが何箇所も別れている設計であるとこのエラーに出会いやすい。極力データを登録するコードはクラス化する等して絞った方が良いだろう。
誰かの参考になれば幸いだ。