在 Rust 中操作数据库:PostgreSQL 与 MongoDB

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
```html

Rust语言数据库操作入门



Rust语言在系统编程领域迅速流行起来,但其能力远不止于底层任务。凭借严格的类型系统、内存安全性和高性能,Rust成为构建与数据库交互的可靠服务器应用的绝佳选择。在本文中,我们将详细解析如何连接并操作两种流行的数据库管理系统:关系型数据库PostgreSQL和文档型数据库MongoDB。



我们将介绍主要的库(crate),例如用于PostgreSQL的diesel和官方驱动mongodb,并展示纯Rust环境下的CRUD操作示例。本文对希望扩展技术栈的新手和经验丰富的开发者都同样适用。



1. 使用PostgreSQL:Diesel库



Diesel是一个安全、可扩展的ORM和Rust查询构建器。它在编译时提供类型检查,从而消除了许多与SQL查询相关的运行时错误。首先,需要在Cargo.toml文件中添加依赖项。



安装与配置



添加以下crate:



[dependencies]diesel = { version = "2.1", features = ["postgres"] }dotenvy = "0.15"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1.0", features = ["full"] }


同时安装Diesel命令行工具:



cargo install diesel_cli --no-default-features --features postgres


在项目根目录创建.env文件,写入数据库URL:



DATABASE_URL=postgres://username:password@localhost/my_database


执行命令以配置迁移:



diesel setupdiesel migration generate create_users


定义模式与模型



在迁移文件up.sql中编写SQL创建表:



CREATE TABLE users (    id SERIAL PRIMARY KEY,    name VARCHAR NOT NULL,    email VARCHAR NOT NULL UNIQUE,    age INTEGER NOT NULL);


然后运行diesel migration run。之后使用以下命令生成Rust模式文件(src/schema.rs):



diesel print-schema > src/schema.rs


现在定义模型和用于插入数据的结构体:



// src/models.rsuse diesel::prelude::*;use serde::{Deserialize, Serialize};use crate::schema::users;

#[derive(Queryable, Selectable, Serialize, Deserialize)]#[diesel(table_name = users)]pub struct User { pub id: i32, pub name: String, pub email: String, pub age: i32,}

#[derive(Insertable, Deserialize)]#[diesel(table_name = users)]pub struct NewUser { pub name: String, pub email: String, pub age: i32,}


PostgreSQL的CRUD操作



我们来看基本操作。连接数据库并创建新用户:



use diesel::prelude::*;use dotenvy::dotenv;use std::env;

use crate::models::{NewUser, User};use crate::schema::users::dsl::*;

pub fn establish_connection() -> PgConnection { dotenv().ok(); let database_url = env::var("DATABASE_URL") .expect("DATABASE_URL must be set"); PgConnection::establish(&database_url) .expect(&format!("Error connecting to {}", database_url))}

pub fn create_user(conn: &mut PgConnection, name: &str, email: &str, age: i32) -> User { let new_user = NewUser { name: name.to_string(), email: email.to_string(), age, };

diesel::insert_into(users) .values(&new_user) .returning(User::as_returning()) .get_result(conn)```

博客

书籍推荐