cargo?? AI 助攻
想自動生成帶注釋的Cargo.toml?用「代碼生成」提示詞,30 秒即可拿到模板,再交給「代碼優化」砍掉冗余特性,編譯速度提升 20%!
cargo new rust-rocket-diesel && cd $_
cargo add diesel --features sqlite
cargo add rocket rocket_contrib rocket_codegen
cargo add serde serde_json serde_derive
cargo add dotenv
Cargo.toml 關鍵片段:
[dependencies]
diesel = { version = "1.4.5", features = ["sqlite"] }
rocket = "0.4.11"
rocket_contrib = "0.4.11"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenv = "0.15.0"
cargo install diesel_cli --no-default-features --features sqlite
echo "DATABASE_URL=database.db" > .env
diesel setup
diesel migration generate create_students
migrations/xxxx_create_students/up.sql:
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
);
down.sql:
DROP TABLE students;
diesel migration run
# 自動生成 src/schema.rs
use serde::{Deserialize, Serialize};
use diesel::prelude::*;
#[derive(Serialize, Deserialize, Queryable, Insertable, AsChangeset)]
#[table_name = "students"]
pub struct Student {
pub id: Option<i32>,
pub name: String,
pub age: i32,
}
use rocket_contrib::databases::diesel::SqliteConnection;
use rocket::http::Status;
use rocket::response::status;
use rocket::Json;
#[database("sqlite_db")]
pub struct DbConn(SqliteConnection);
#[post("/student", format = "json", data = "<new_student>")]
fn create_student(
new_student: Json<Student>,
conn: DbConn,
) -> Result<Json<Value>, Status> {
conn.run(|c| {
diesel::insert_into(students::table)
.values(&new_student.into_inner())
.execute(c)
.map_err(|_| Status::InternalServerError)?;
Ok(json!({ "status": "success" }))
})
}
#[get("/students")]
fn get_students(conn: DbConn) -> Result<Json<Value>, Status> {
conn.run(|c| {
let results = students::table
.load::<Student>(c)
.map_err(|_| Status::InternalServerError)?;
Ok(Json(json!(results)))
})
}
#[put("/students/<id>", format = "json", data = "<update>")]
fn update_student(
id: i32,
update: Json<Student>,
conn: DbConn,
) -> Result<Json<Value>, Status> {
conn.run(|c| {
diesel::update(students::table.find(id)))
.set(&update.into_inner())
.execute(c)
.map_err(|_| Status::InternalServerError)?;
Ok(json!({ "status": "success", "updated_id": id }))
})
}
#[delete("/students/<id>")]
fn delete_student(id: i32, conn: DbConn) -> Result<Json<Value>, Status> {
conn.run(|c| {
diesel::delete(students::table.find(id)))
.execute(c)
.map_err(|_| Status::InternalServerError)?;
Ok(json!({ "status": "success", "deleted_id": id }))
})
}
?? AI 審查
把「Diesel 查詢錯誤處理」提交評審?「代碼審查助手」可自動檢查連接池泄露、SQL 注入風險,提前發現 80% 潛在 Bug!
cargo run
# 默認監聽 localhost:8000
# 新增學生
curl -X POST localhost:8000/student \
-H "Content-Type: application/json" \
-d '{"name":"Alice","age":20}'
# 查詢全部
curl localhost:8000/students
# 更新
curl -X PUT localhost:8000/students/1 \
-H "Content-Type: application/json" \
-d '{"name":"Alice","age":21}'
# 刪除
curl -X DELETE localhost:8000/students/1
? AI 補救
把「curl 測試命令」寫進 README 太麻煩?用「代碼文檔生成器」提示詞,自動在函數頭部生成標準注釋,提醒后續接入 Postman 集合,文檔一鍵達標!
| 階段 | 技術點 | 工具/庫 |
|---|---|---|
| ① 認證 | JWT + Rocket 中間件 | rocket-jwt |
| ② 分頁 | limit/offset 查詢 |
diesel-pagination |
| ③ 日志 | 結構化日志 | tracing |
| ④ 容器化 | 多階段構建 | Docker |
| ⑤ CI/CD | GitHub Actions | cargo test + clippy |
通過本教程,您已學會:
下一步可在此基礎上添加認證、分頁、OpenAPI 文檔等功能,打造生產級后端。祝編碼愉快!
今晚就 push 到 GitHub,明天就能用 Fly.io 一鍵部署!??
原文鏈接: https://earthly.dev/blog/rust-api-rocket-diesel/