研究一下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/