influxdb 时序数据库新建/删除连续查询
Dbs:{
host: "192.168.0.1",
port: 8086,
database: "mydb",
username: "root",
password: "root"
}
1、新建连续查询
const Influx = require('influx');
const influx = new Influx.InfluxDB(Dbs)
await influx.createContinuousQuery(<连续查询名称>, <sql>, <时序数据库名>, <执行间隔>)
//连续查询名称 ——> dataanalysis
//sql ——> select count(FYJYL) as nsywzerototal INTO dataanalysis.autogen.dataanalysis FROM mydb.autogen.processdata where FYJYL = 0 group by time(1d),SBXLH fill(0)
//时序数据库名 ——> mydb
//执行间隔 ——> RESAMPLE EVERY 4h
2、删除连续查询
const influx = new Influx.InfluxDB(Dbs)
await influx.dropContinuousQuery(<连续查询名称>, <时序数据库名>)
3、查询
const influx = new Influx.InfluxDB(Dbs)
await influx.query(`select ...`).then(result=>{})
4、连续查询注意事项
(1)查询的内容字段不能一条连续查询插入到表中时,可以建多个连续查询,但不能含重复的字段,否则重复字段内容会被覆盖;
(2)插入表中的数据若时间与key字段相同时,其内容将被最新数据覆盖,即相同时间的相同key只有一条数据。
5、SQL直接执行
官网传送门:https://docs.influxdata.com/influxdb/v1.7/query_language/continuous_queries/
涉及到INTO知识点
SELECT_clause INTO <插入的表> FROM_clause [WHERE_clause] [GROUP_BY_clause]
#select count(FYJYL) as nsywzerototal INTO dataanalysis.autogen.dataanalysis FROM mydb.autogen.processdata where FYJYL = 0 group by time(1d),SBXLH fill(0)
新建连续查询
CREATE CONTINUOUS QUERY <连续查询名称> ON <库名>
RESAMPLE EVERY <执行时间间隔> FOR 执行时间范围
BEGIN
<cq_query>
END
如 RESAMPLE EVERY 30m FOR 60m
==> 即每隔30分钟计算一次60分钟内的数据
6、可视化新建连续查询
7、连续查询执行顺序问题
连续查询创建顺序即连续查询执行顺序,先创建的连续查询先执行;时序数据库持续插入数据,因此统计数据可能与实际存在误差(使用连续查询不可避免)。
8、数据插入
插入表没有将自动创建
influx.writePoints([{
measurement: 'table_name',//表名
tags:{code:4401},
fields: { time:'2022-12-01 14:00:00', value:100.02 }, //字段
timestamp: new Date().getTime()+'004401' // 需要补充6位尾数,最好与tag字段相关以防止不同数据相同数据被覆盖
}],{ precision: 'n' })
await influx.query(`select ...`).then(result=>{
console.log(result) // [{time:'2022-12-01 14:00:00',value:100.02,code:4401}]
})
http 插入
const reuqest = require("request")
let host='127.0.0.1',
port='8086',
database='dbname'
// 数据格式 <measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>]
// 使用账号密码 http://${host}:${port}/write?db=${db.database}&u=${username}&p=${password}&precision=ns
let url = `http://${host}:${port}/write?db=${db.database}&u=${username}&p=${password}&precision=ns`;
return new Promise(res => {
request(
{
url: url,
method: 'POST',
data: `table_name,code=1101,key='GH00' name='测试',value=10 1727193599999999999`, // <measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
timeout: 30000 //30秒超时
},
function (error, response, body) {
// error 请求错误处理
}
);
});
参考:https://node-influx.github.io/class/src/index.js~InfluxDB.html
官网文档:https://influxdb-v1-docs-cn.cnosdb.com/influxdb/v1.8/write_protocols/line_protocol_reference/