【InfluxDB】最近どう?InfluxQL打ってる?【node-influx】

April 15, 2020

InfluxDBはSQLは使えずInfluxQLというものを使う。今回はnode-influxを通じてInfluxQLを打ってみる。

influxql maiteru

疑問

例えば舌鼓は"打つ”ものである。「舌鼓を打つ」

的は"射る"(現代では"得る"も正解)である。「的を射る」

さて、ではSQLは どうするものなのだろうか。私は考える。Googleを使って考える。

検索ワード 件数(約)
"SQLを叩く" 119,000
"SQLを発行" 68,900
"SQLを送る" 33,300
"SQLを打つ" 7,710

このような結果であった。SQLは「叩く」ものらしい。

どういうわけか私はSQLは「打つ」ものである。舌鼓と同じなのだ。

SQL

InfluxDBではSQLを打つことはできない。

InfluxQLと呼ばれるものを打っていく。

方法

では、どのようにしてInfluxDBにInfluxQLを打ち込むのだろうか。

私の環境(Windows10 + Node.js)では3種類ある。

  1. influx.exe を使ってコマンドラインで打つ
  2. ChronografのUIから打つ
  3. node-influxから打つ

1は最も手軽だが、別のプログラムからの呼び出せるのかすら不明(多分できる)。InfluxQLの文法に慣れているのであればちょっとしたアクセスはここからできそうだ。

2は可視化するためには便利だが外部からは利用不可能。

3別のプログラムから利用するならこれだろう。

公式ドキュメント

InfluxQLに関しては「Influx Query Language (InfluxQL) referenc」にクエリが記載されている。

InfluxDBオブジェクト

まずはInfluxDBオブジェクトをnewする。

パスワードをかけている場合はここでusernameとpasswordを設定しておく。次は公式より引用

const Influx = require('influx')
// Connect to a single host with a DSN:
const influx = new Influx.InfluxDB('http://user:password@host:8086/database')

queryメソッド

influx.query(`SHOW DATABASES`).then((data) => {
    console.log(data)
}).catch((err) => {
  //クエリ失敗処理
})

queryのメソッドで文字列を渡してやればよい。カッコの内部はクエリでダブルクォーテーションとシングルクォーテーションを混ぜて使うことがあるのでその外側である扱いでバックティック/バッククォート(` `)にする。shift + @で出る。

promiseなのでthenが必要。

私のDBでは次のような結果が帰ってくる。

[
  { name: '_internal' },
  { name: 'chronograf' },
  { name: 'bitFlyer_db' },
  { name: 'telegraf' },
  groupsTagsKeys: [],
  groupRows: [ { name: 'databases', rows: [Array], tags: {} } ],
  group: [Function: groupMethod],
  groups: [Function: groupsMethod]
]

クエリ

実は文法はほとんどSQLと変わらない。よって基本的すぎるコマンドは省略して時系列DBらしいコマンドを紹介する。

時間で絞る

WHERE句にてtimeをつかって絞れば良い。

influx.query(
    `SELECT * FROM "bitFlyer_db"."autogen"."lightning_executions_FX_BTC_JPY" WHERE time > now() - 20s`
).then((data) =>

now()を使うと現在の時間を取得できる。

ここでの20sは20秒を表すので、20秒前までのデータが取得される。s以外にもm,h,d等あるので公式:Durationsの項にて確認しておく。

条件を加えたい場合は ANDでつなげる。例えば time > now() - 1m AND time < now() - 30s (現在から1分前~30秒前の間にあるデータ)

特定の日時に絞る

先程は現在の時刻から計算で時刻を求めたが、絶対値を指定する場合はどうするのだろうか。

次のいずれかで表現する。

  • 'YYYY-MM-DDTHH:mm:ss.nnnnnnnnnZ'
  • 'YYYY-MM-DDTHH:mm:ss'
  • 'YYYY-MM-DD HH:mm:ss.nnnnnnnnn'
  • 'YYYY-MM-DD HH:mm:ss'

2020/05/11追記:mm:ssを小文字に修正(月のMMと混乱するため)。またDay.jsの標準フォーマット.format()による2020-05-10T09:00:00+09:00表記がそのまま利用できた。

nはナノセカンド。

またUNIX秒( 1439856360s )も指定可能。

'YYYY-MM-DD HH:mm:ss' + 6s という使い方もできる。

重要

  • UTC表記になるので日本時間の場合はこれに9時間プラスする

    逆に日本時間からUTCにする場合は9時間マイナスする

  • 必ず 'シングルクォーテーション' で囲む

注意

例:WHERE time = '2020-04-15T05:14:04Z'

このようなコードで絞った場合、14分4秒台のデータが全部出力されるかと思うかもしれないが、厳密にはナノセカンドが省略されているだけなので4秒ジャスト(ナノセカンドまで一致)のデータしか出力されない。従ってレコードなしとなる可能性が高いので注意したい。

参考

今回は公式ドキュメントはボリュームがありすぎるので次のYoutube動画(コレも公式)を参考にした。

英語だがプレゼン資料が丁寧に整理されており画面を見ているだけでもいろいろ分かると思う。

本日はここまで

覚えることがたくさんありそうなので今回はここまで。

JavaScriptの時間計算はちょっと面倒なのでアレルギーが出そうだが真剣に覚えておいたほうが良いかもしれない。

この記事をシェア:

author icon

仮想トイレ @CrypticToilet
プログラミングや仮想通貨のシステムトレードに関する情報を更新中!どんな情報を流しても詰まらないトイレ。