例えば舌鼓は"打つ”ものである。「舌鼓を打つ」
的は"射る"(現代では"得る"も正解)である。「的を射る」
さて、ではSQLは どうするものなのだろうか。私は考える。Googleを使って考える。
検索ワード | 件数(約) |
---|---|
"SQLを叩く" | 119,000 |
"SQLを発行" | 68,900 |
"SQLを送る" | 33,300 |
"SQLを打つ" | 7,710 |
このような結果であった。SQLは「叩く」ものらしい。
どういうわけか私はSQLは「打つ」ものである。舌鼓と同じなのだ。
InfluxDBではSQLを打つことはできない。
InfluxQL
と呼ばれるものを打っていく。
では、どのようにしてInfluxDBにInfluxQLを打ち込むのだろうか。
私の環境(Windows10 + Node.js)では3種類ある。
1は最も手軽だが、別のプログラムからの呼び出せるのかすら不明(多分できる)。InfluxQLの文法に慣れているのであればちょっとしたアクセスはここからできそうだ。
2は可視化するためには便利だが外部からは利用不可能。
3別のプログラムから利用するならこれだろう。
InfluxQLに関しては「Influx Query Language (InfluxQL) referenc」にクエリが記載されている。
まずは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')
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秒前の間にあるデータ)
先程は現在の時刻から計算で時刻を求めたが、絶対値を指定する場合はどうするのだろうか。
次のいずれかで表現する。
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の時間計算はちょっと面倒なのでアレルギーが出そうだが真剣に覚えておいたほうが良いかもしれない。