using System.Collections.Concurrent; using System.Data; using MesETL.Shared.Helper; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; var host = Host.CreateApplicationBuilder(args); host.Configuration.AddCommandLine(args, new Dictionary { { "-s", "ConnectionString" }, { "--ConnectionString", "ConnectionString" }, { "-B", "Databases" }, { "--Databases", "Databases" }, { "-a", "All" } }); host.Build(); var connStr = host.Configuration.GetValue("ConnectionString") ?? throw new ApplicationException("没有配置数据库连接字符串"); var databases = host.Configuration.GetValue("Databases")?.Split(',').ToList() ?? throw new ApplicationException("没有配置数据库"); var all = host.Configuration.GetValue("All"); if (args.Length > 1 && args[0] == "count") { var result =await CountDatabasesAsync(connStr, databases); if (all) { foreach (var (k, v) in result) { Console.WriteLine(k + ":"); Console.WriteLine(v.Select(pair => new { TABLE_NAME = pair.Key, COUNT = pair.Value }).ToMarkdownTable()); } } else { var allCount = result.Aggregate(new Dictionary(), (dict, pair) => { foreach (var (k, v) in pair.Value) { dict.AddOrUpdate(k, v, (key, num) => num + v); } return dict; }); Console.WriteLine(allCount.Select(pair => new { TABLE_NAME = pair.Key, COUNT = pair.Value }).ToMarkdownTable()); } } async Task>> CountDatabasesAsync(string connStr, IList dbNames, CancellationToken cancellationToken = default) { var result = new ConcurrentDictionary>(); var tables = await DatabaseHelper.QueryTableAsync(connStr, $""" SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '{dbNames[0]}'; """); await Parallel.ForEachAsync(dbNames, async (dbName, ct) => { await Parallel.ForEachAsync(tables.Tables[0].Rows.Cast(), async (row, ct) => { var tableName = row[0].ToString()!; var count = (long)(await DatabaseHelper.QueryScalarAsync(connStr, $"SELECT COUNT(1) FROM `{dbName}`.`{tableName}`;", ct))!; result.AddOrUpdate(dbName, new ConcurrentDictionary(), (db, dict) => { dict.AddOrUpdate(tableName, count, (table, num) => num + count); return dict; }); }); }); return result; }