美烦资源网

专注技术文章分享,涵盖编程教程、IT 资源与前沿资讯

Rust sea-orm helloworld简单可用入门CRUD

研究一下Rust语言中的数据库ORM库,发现就没一个顺顺利利,干干脆脆,直接能跑起来的简单demo,不要求多复杂,对新手来讲,第一次,能连上数据库,能CRUD,能顺利编译过,能运行无误就可以了。

一气之下让deepseek给出一个demo,有板有眼,但是还是编译不过去。

查看官方文档,又fighting了一阵,搞定了,分享一下,主打一个rust sea-orm helloworld看我这篇就行了。

________________________________________________________________________

不废话,上代码。

环境版本:

rustc 1.86.0, mysql 数据库8.0 ubuntu虚拟机。


数据库脚本:

CREATE DATABASE seaorm_demo;

CREATE TABLE `user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

`email` varchar(255) NOT NULL,

`created_at` datetime DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`),

UNIQUE KEY `email` (`email`)

);

嫌麻烦可以把UNIQUE KEY去掉,省得每次插入的数据都不一样。


rust 代码:

Cargo.toml


[dependencies]

sea-orm = { version = "0.12.8", features = [ "sqlx-mysql", "runtime-async-std-native-tls", "macros" ] }

tokio = { version = "1", features = ["full"] }

serde = { version = "1", features = ["derive"] }

——————————————————————————————————————

user.rs(deepseek生成的,后续研究用seaorm cli生成)


use sea_orm::entity::prelude::*;

use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)]

#[sea_orm(table_name = "user")]

pub struct Model {

#[sea_orm(primary_key)]

pub id: i32,

pub name: String,

pub email: String,

pub created_at: DateTimeUtc,

}


#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]

pub enum Relation {}


impl ActiveModelBehavior for ActiveModel {}


——————————————————————————————————————————

main.rs


mod user;

use sea_orm::*;

use user::Entity as User;


#[tokio::main]

async fn main() -> Result<(), DbErr> {

let db_url = "mysql://root:XXXXX@192.168.3.211/seaorm_demo";

// 创建数据库连接

let conn: DatabaseConnection = Database::connect(db_url).await?;


// 插入新用户

let new_user = user::ActiveModel {

name: Set("Alice122321115".to_owned()),

email: Set("alice1223221115

@example.com"

.to_owned()),

..Default::default()

};

let insert_result = User::insert(new_user).exec(&conn).await?;

println!("Inserted user ID: {}", insert_result.last_insert_id);


// 更新用户

let user = User::find_by_id(1).one(&conn).await.unwrap();

let mut user: user::ActiveModel = user.unwrap().into();

user.name = Set("Alice Updated".to_owned());

let user: user::Model = user.update(&conn).await?;

println!("updated: {},{}", user.id, user.name);


// 查询所有用户

let users = User::find().all(&conn).await?;

println!("All users: {:#?}", users);


// 删除用户

let delete_result = user::Entity::delete_by_id(insert_result.last_insert_id)

.exec(&conn)

.await?;

println!("deleted rows: {:#?}", delete_result.rows_affected);


let query_res_vec: Vec<QueryResult> = conn

.query_all(Statement::from_string(

DatabaseBackend::MySql,

"SELECT * FROM `user`;",

))

.await?;


println!("query_res_vec: {:#?}", query_res_vec);


//jsonVale (自定义SQL,官方叫rawsql ,查询返回JOSN)


let resultjson: Vec<JsonValue> =

<sea_orm::JsonValue as sea_orm::FromQueryResult>::find_by_statement(

Statement::from_sql_and_values(DbBackend::MySql, r#"SELECT * FROM `user`;"#, []),

)

.all(&conn)

.await?;

println!("resultjson: {:#?}", resultjson);

Ok(())

}


____________________________________________________________


像mybatis一样,单表的CRUD非常香,但是多表关联查询,还用orm的话,那会适得其反,直接用SQL吧。


CRUD一般没问题,关键是考察自定义sql,及web后台接口返回JSON数据。

关于raw sql可以参考官方教程:

https://www.sea-ql.org/SeaORM/docs/basic-crud/raw-sql/



控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言