You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中使用Diesel ORM是否需要重复定义数据类型?

关于Diesel ORM类型重复定义的解决方案

首先明确:完全可以实现单一可信来源,不管是从SQL自动生成所有Rust类型,还是用Rust定义反向生成SQL迁移,都能避免重复编写。

一、从SQL定义自动生成Rust Models(避免手动写models.rs)

官方教程让你手动写models是为了演示底层逻辑,实际开发中根本不用重复定义。

  1. 先通过diesel migration run自动生成schema.rs(这一步你已经在做)
  2. 对于models,可以用两种方式减少/消除重复:
    • 用Derive宏简化:不用手动匹配字段类型,直接基于schema.rs的表定义derive对应的trait:
      // models.rs
      use diesel::Queryable;
      use crate::schema::users;
      
      #[derive(Queryable, Insertable, Debug)]
      #[diesel(table_name = users)]
      pub struct User {
          pub id: i32,
          pub name: String,
          pub email: String,
      }
      
      这里字段类型必须和schema.rs对应,但不用你手动对照SQL类型,只要跟着schema.rs里的Rust类型写就行(比如schema.rs里的Integer对应i32,Text对应String)。
    • 用工具自动生成models:社区有现成工具可以直接读取schema.rs自动生成包含所有derive宏的models代码,完全不用手动写字段。

二、用Rust定义反向生成SQL迁移(代码优先)

如果你想把Rust代码作为单一可信来源,也可以反过来,先写Rust的结构体定义,再生成SQL迁移文件:

  1. 定义带diesel宏注解的Rust结构体:
    use diesel::table;
    
    table! {
        users (id) {
            id -> Integer,
            name -> Text,
            email -> Text,
        }
    }
    
    或者用更简洁的derive方式:
    #[derive(Table, Insertable, Queryable)]
    #[table(name = "users")]
    pub struct User {
        #[primary_key]
        pub id: i32,
        pub name: String,
        pub email: String,
    }
    
  2. 通过工具将这些Rust定义转换成migrations目录下的up.sql和down.sql文件,这样所有变更只需要修改Rust代码,再同步生成SQL即可。

为什么官方教程要让你手动写models?

官方入门教程的核心是让你理解Diesel的分层设计:schema.rs是数据库结构的直接映射,models.rs是业务层的数据模型(可以根据业务需求调整,比如添加额外方法、隐藏敏感字段等)。但实际开发中,大部分简单场景不需要自定义models,直接自动生成即可。


内容的提问来源于stack exchange,提问作者goose_lake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:02:38