clickhouse数据库,http请求访问,支持参数化

csharp 复制代码
public class ClickHouseClient
{
    private static readonly HttpClient _httpClient = new HttpClient();
    private readonly string _clickHouseUrl;
    private readonly string _username;
    private readonly string _password;
    private string _database;
    private static readonly string _searchFormat = " FORMAT JSON";

    public ClickHouseClient()
    {
        _clickHouseUrl = "url";
        _username = "user_name";
        _password = "password";
        if (string.IsNullOrWhiteSpace(_clickHouseUrl) || string.IsNullOrWhiteSpace(_username) || string.IsNullOrWhiteSpace(_password))
        {
            System.Text.StringBuilder str = new System.Text.StringBuilder();
            str.Append("ClickHouse配置缺失,CloudStorage:ClickHouse");
            if (string.IsNullOrWhiteSpace(_clickHouseUrl))
            {
                str.Append("节点EndPoint,");
            }
            if (string.IsNullOrWhiteSpace(_username))
            {
                str.Append("节点UId,");
            }
            if (string.IsNullOrWhiteSpace(_password))
            {
                str.Append("节点Password,");
            }
            throw new Exception($"{str.ToString().TrimEnd(',')}未配置");
        }
        _database = "default";
        SetAuthorizationHeader();
    }

    /// <summary>
    /// 设置查询数据库
    /// </summary>
    /// <param name="database"></param>
    public void SetDatabase(string database)
    {
        _database = database;
        SetAuthorizationHeader();
    }

    /// <summary>
    /// 单个查询,参数化格式:sql语句中:{id:String},赋值:{"id","666"}
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="query"></param>
    /// <param name="parameters"></param>
    /// <returns></returns>
    public List<T> ExecuteQuery<T>(string query, Dictionary<string, string> parameters = null) where T : class
    {
        try
        {
            var response = SendRequest($"{query} {_searchFormat}", parameters);
            var responseString = response.Content.ReadAsStringAsync().Result;
            var data = System.Text.Json.JsonSerializer.Deserialize<ClickHouseBaseModel<T>>(responseString);
            return data?.data;
        }
        catch (HttpRequestException)
        {
            throw;
        }
    }

    /// <summary>
    /// 单条插入,参数化格式:sql语句中:{id:String},赋值:{"id","666"}
    /// </summary>
    /// <param name="query"></param>
    /// <param name="parameters"></param>
    public void ExecuteNonQuery(string query, Dictionary<string, string> parameters = null)
    {
        try
        {
            SendRequest(query, parameters);
        }
        catch (HttpRequestException)
        {
            throw;
        }
    }

    /// <summary>
    /// 设置访问信息
    /// </summary>
    private void SetAuthorizationHeader()
    {
        _httpClient.DefaultRequestHeaders.Clear();
        _httpClient.DefaultRequestHeaders.Add("X-ClickHouse-User", _username);
        _httpClient.DefaultRequestHeaders.Add("X-ClickHouse-Key", _password);
        _httpClient.DefaultRequestHeaders.Add("X-ClickHouse-Database", _database);
    }

    /// <summary>
    /// 进行访问
    /// </summary>
    /// <param name="query"></param>
    /// <param name="parameters"></param>
    /// <returns></returns>
    private HttpResponseMessage SendRequest(string query, Dictionary<string, string> parameters = null)
    {
        var formData = new MultipartFormDataContent
        {
            { new StringContent(query), "query" }
        };

        if (parameters != null)
        {
            foreach (var param in parameters)
            {
                string paramKey = param.Key;
                if (!param.Key.StartsWith("param_"))
                {
                    paramKey = $"param_{paramKey}";
                }

                formData.Add(new StringContent(param.Value), paramKey);
            }
        }

        var response = _httpClient.PostAsync(_clickHouseUrl, formData).Result;
        response.EnsureSuccessStatusCode();
        return response;
    }
}
csharp 复制代码
      public void TestClickHouse()
      {
          var client = new ClickHouseClient();
          client.SetDatabase("default");
          var sqlSearch = "select id Id, serial_number SerialNumber from test_table";
          var result = client.ExecuteQuery<TestTable>(sqlSearch);

          var sql = "insert into test_table(id,serial_number) values({id:String},{serial_number:UInt32})";
          var param = new Dictionary<string, string>()
          {
              {"id","777"},
              {"serial_number","1234"}
          };
          client.ExecuteNonQuery(sql, param);
      }

      public class TestTable
      {
          public string Id { get; set; }
          public long SerialNumber { get; set; }
      }
相关推荐
l1t1 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
ftpeak4 小时前
从零开始使用 axum-server 构建 HTTP/HTTPS 服务
网络·http·https·rust·web·web app
MarkHard1235 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
island13147 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
数据库·redis·bootstrap
心想事成的幸运大王7 小时前
Redis的过期策略
数据库·redis·缓存
倔强的石头_7 小时前
CentOS 上安装KingbaseES(ISO包)详细教程
数据库
2401_897930068 小时前
使用Docker轻松部署Neo4j图数据库
数据库·docker·neo4j
诗句藏于尽头8 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
寻星探路8 小时前
数据库造神计划第六天---增删改查(CRUD)(2)
java·大数据·数据库
盖世英雄酱581369 小时前
Read timed out问题 排查
java·数据库·后端