C# 中使用 Influxdb 1.x(三)
基于前面2节介绍,借助AI,搭建更完善的功能测试案例,实现如下功能:
功能点
- 创建Measurement,
- 插入单个数据点,
- 批量插入数据点,
- 查询数据,
- 删除数据,
- 显示数据库信息,
- 管理连续查询,
- 退出
功能测试基于代码创建的sensor_data数据库

创建Measurements

#region 创建Measurement(向数据表中插入数据,及创建表)private static async Task CreateMeasurement(){AnsiConsole.MarkupLine("[bold underline]创建新的Measurement[/]");// 获取Measurement名称var measurement = AnsiConsole.Ask<string>("输入Measurement名称:");// 创建示例数据点来初始化Measurementvar point = new Point{Name = measurement,Tags = new Dictionary<string, object>{{ "location", "example" }},Fields = new Dictionary<string, object>{{ "value", 0.0 },{ "status", "init" }},Timestamp = DateTime.UtcNow};try{await _influxDbClient.Client.WriteAsync(point, DatabaseName);AnsiConsole.MarkupLine($"[bold green]Measurement '{measurement}' 创建成功![/]");}catch (Exception ex){AnsiConsole.MarkupLine($"[bold red]创建失败: {ex.Message}[/]");}}#endregion
插入单点数据和批量数据


#region 插入数据private static async Task InsertSingleDataPoint(){AnsiConsole.MarkupLine("[bold underline]插入单个数据点[/]");var measurement = AnsiConsole.Ask<string>("输入Measurement名称:");var location = AnsiConsole.Ask<string>("输入位置标签:");var value = AnsiConsole.Ask<double>("输入数值:");var status = AnsiConsole.Prompt(new SelectionPrompt<string>().Title("选择状态").AddChoices("正常", "警告", "故障"));var point = new Point{Name = measurement,Tags = new Dictionary<string, object>{{ "location", location }},Fields = new Dictionary<string, object>{{ "value", value },{ "status", status }},Timestamp = DateTime.UtcNow};try{await _influxDbClient.Client.WriteAsync(point, DatabaseName);AnsiConsole.MarkupLine($"[bold green]数据点插入成功![/]");// 显示插入的数据点var table = new Table();table.AddColumn("Measurement");table.AddColumn("Location");table.AddColumn("Value");table.AddColumn("Status");table.AddColumn("Timestamp");var data = DateTime.Now;table.AddRow(measurement,location,value.ToString("F2"),status,point.Timestamp?.ToString("yyyy-MM-dd HH:mm:ss"));AnsiConsole.Write(table);}catch (Exception ex){AnsiConsole.MarkupLine($"[bold red]插入失败: {ex.Message}[/]");}}private static async Task InsertBatchDataPoints(){AnsiConsole.MarkupLine("[bold underline]批量插入数据点[/]");var measurement = AnsiConsole.Ask<string>("输入Measurement名称:");var location = AnsiConsole.Ask<string>("输入位置标签:");var count = AnsiConsole.Ask<int>("要插入的数据点数量:", 5);var points = new List<Point>();var random = new Random();for (int i = 0; i < count; i++){var value = Math.Round(20 + random.NextDouble() * 10, 2);var status = value > 28 ? "警告" : "正常";points.Add(new Point{Name = measurement,Tags = new Dictionary<string, object>{{ "location", location }},Fields = new Dictionary<string, object>{{ "value", value },{ "status", status }},Timestamp = DateTime.UtcNow.AddMinutes(-count + i)});}try{await _influxDbClient.Client.WriteAsync(points, DatabaseName);AnsiConsole.MarkupLine($"[bold green]成功插入 {count} 个数据点![/]");// 显示部分插入的数据点var table = new Table();table.AddColumn("序号");table.AddColumn("Measurement");table.AddColumn("Location");table.AddColumn("Value");table.AddColumn("Status");table.AddColumn("Timestamp");for (int i = 0; i < Math.Min(3, points.Count); i++){var point = points[i];table.AddRow((i + 1).ToString(),measurement,location,point.Fields["value"].ToString(),point.Fields["status"].ToString(),point.Timestamp?.ToString("yyyy-MM-dd HH:mm:ss"));}if (points.Count > 3){table.AddRow("...", "...", "...", "...", "...", "...");}AnsiConsole.Write(table);}catch (Exception ex){AnsiConsole.MarkupLine($"[bold red]批量插入失败: {ex.Message}[/]");}}#endregion
查询数据

#region 查询数据private static async Task QueryData(){AnsiConsole.MarkupLine("[bold underline]查询数据[/]");var measurement = AnsiConsole.Ask<string>("输入Measurement名称:");var location = AnsiConsole.Ask<string>("输入位置标签 (或按回车查询所有位置):", "all");var hours = AnsiConsole.Ask<int>("查询过去多少小时的数据:", 24);var whereClause = location != "all"? $"WHERE location = '{location}'": "";var query = $"SELECT * FROM \"{measurement}\" {whereClause} " +$"WHERE time > now() - {hours}h";try{var response = await _influxDbClient.Client.QueryAsync(query, DatabaseName);