当前位置: 首页 > article >正文

rust如何操作sqlserver

rust中操作mysql和pgsql的技术非常多,也很成熟。但是操作mssql的办法,确实不多。作为一个sql server多年的使用者,我总不能用rust之后,就放弃mssql吧。

我尝试了一下,我们国人开发的rbatis,rbatis是支持mssql的。但是很遗憾,我使用的是兼容win7的rust 1.77.2这个版本,rbatis在这个环境并没有跑起来。

我找到了tiberius,这个库是可以用的。但是这个库只有339星,热度非常低,我们来看看,如何使用tiberius。

我们来看一个完整的示例,从mssql中取数据库中所有的表和视图名称:

 // 配置连接设置
    let mut config = Config::new();
    config.host(params.host); // 替换为你的 SQL Server 的 IP 地址或主机名
    config.database(params.database);
    config.port(params.port); // SQL Server 的默认端口
    config.authentication(AuthMethod::sql_server(params.user, params.password)); // 替换为你的用户名和密码
    config.trust_cert();
    // 连接到 SQL Server
    let tcp = TcpStream::connect(config.get_addr()).await.map_err(|e| {
        //debug!("无法连接到mssql {}", e);
        ApiError::InternalError(format!("无法连接到mssql: {}", e))
    })?;
    tcp.set_nodelay(true).map_err(|e| {
        //debug!("无法连接到mssql_1 {}", e);
        ApiError::InternalError(format!("无法连接到mssql_1: {}", e))
    })?;

    let mut client = Client::connect(config, tcp.compat_write())
        .await
        .map_err(|e| {
            //debug!("无法连接到mssql_2 {}", e);
            ApiError::InternalError(format!("无法连接到mssql_2: {}", e))
        })?;
    let sql = "SELECT TABLE_NAME  AS table_name, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES
                 WHERE TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW'
                 ORDER BY TABLE_NAME;";

    let mut stream = client
        .query(sql, &[])
        .await
        .map_err(|_| ApiError::InternalError("数据查询失败".to_string()))?;
    let rows = stream
        .into_results()
        .await
        .map_err(|_| ApiError::InternalError("数据查询失败".to_string()))?;

    let json_results =
        rows_to_json_mssql(rows).map_err(|_| ApiError::InternalError("转换失败".to_string()))?;

经过测试,并没有发现tiberius有什么问题,你可以愉快地用它来操作sql server。当然我有批量插入数据到mssql的需求,tiberius并不能满足,所以我后面用了替代的办法。

代码取自hpctb


http://www.kler.cn/a/526509.html

相关文章:

  • 零基础Vue入门4——Vue3基础核心
  • 【已解决】黑马点评项目Redis版本替换过程的数据迁移
  • 算法的时间复杂度
  • STM32 LED呼吸灯
  • 知识库管理驱动企业知识流动与工作协同创新模式
  • decison tree 决策树
  • 每日 Java 面试题分享【第 17 天】
  • 18、智能驾驶芯片外部接口要求
  • SpringBoot中运行Yolov5程序
  • 前端知识速记—JS篇:null 与 undefined
  • Linux实操篇-文件目录类>/>>/echo/head/tail/ln/history
  • leetcode-分割等和子集
  • Java中 instanceof 的用法(详解)
  • 安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】
  • 谭浩强C语言程序设计(4) 8章(上)
  • deepseek R1 14b显存占用
  • 【Block总结】HWD,小波下采样,适用分类、分割、目标检测等任务|即插即用
  • 【Block总结】CAA捕获远程上下文信息,增强特征提取的能力|即插即用
  • 哈希表实现
  • 缓冲区和c库的简单实现
  • 性能优化2-删除无效引用
  • kobject、kset和ktype的关系
  • 论文阅读(七):贝叶斯因果表型网络解释遗传变异和生物学知识
  • python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
  • 春晚舞台上的智能革命:中美人形机器人技术对比与发展
  • 日志2025.1.30