Rust与PostgreSQL:让你的代码更快的组合
\n\n你是否曾想过,为什么越来越多的后端开发者转向Rust?答案很简单:Rust让你掌控内存和速度,而PostgreSQL让你掌控数据。两者结合,能够承受每秒数十万次请求的负载,而不会出现"卡顿"和内存泄漏。
\n\n在本指南中,我们将探讨如何让Rust与PostgreSQL协同工作。你将学习如何配置连接、执行查询、避免SQL注入以及构建异步应用程序。让我们开始吧!
\n\n为什么选择Rust和PostgreSQL?
\n\nRust不仅仅是一种时髦的语言。它的所有权系统和借用检查器确保你不会遇到空指针或悬垂引用。而PostgreSQL也不仅仅是一个数据库。它是一个强大的工具,支持JSON、全文搜索和复杂事务。
当你将Rust和PostgreSQL结合使用时,你将获得:
\n- \n
- 安全性 — Rust不会让你意外发送不正确的SQL。 \n
- 性能 — 异步驱动程序的运行速度与C语言相当。 \n
- 控制力 — 你自行决定何时以及如何拉取数据。 \n
安装与环境配置
\n\n在编写代码之前,请确保你已经安装了以下内容:
\n- \n
- Rust(最新的稳定版本) —
rustup update\n - PostgreSQL(本地或通过Docker) —
docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres\n libpq-dev库(适用于Linux)或Mac/Windows上的类似库 \n
创建一个新项目:
\n\ncargo new rust-postgres-guide\ncd rust-postgres-guide\n\n选择驱动程序:tokio-postgres vs sqlx
\n\n在Rust中,有两种主要方式与PostgreSQL交互:
\n- \n
- tokio-postgres — 底层异步驱动程序。提供完全控制。 \n
- sqlx — 高层异步驱动程序,可在编译时检查查询。 \n
对于高级项目,我推荐使用sqlx——它更方便、更安全。但如果你需要最大程度的控制,请使用tokio-postgres。
\n\n将依赖项添加到Cargo.toml:
[dependencies]\ntokio = { version = "1", features = ["full"] }\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\nserde = { version = "1", features = ["derive"] }\n\n\n首次连接:Rust与PostgreSQL相遇
\n\n编写一个简单的示例,连接到数据库并返回PostgreSQL版本。
\n\nuse sqlx::postgres::PgPoolOptions;\nuse std::error::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> {\n // 连接字符串:postgres://user:password@host:port/db\n let database_url = "postgres://postgres:pass@localhost:5432/postgres";\n \n // 创建连接池(可重用连接)\n let pool = PgPoolOptions::new()\n .max_connections(5)\n .connect(database_url)\n .await?;\n\n // 执行查询\n let row: (String,) = sqlx::query_as("SELECT version()")\n .fetch_one(&pool)\n .await?;\n\n println!("PostgreSQL version: {}", row.0);\n Ok(())\n}\n\n运行代码:cargo run。如果一切配置正确,你将看到PostgreSQL版本。请注意PgPoolOptions——连接池在生产环境中是必需的。它重用连接,而不是为每个请求重新创建连接。
创建表与CRUD操作
\n\n现在,让我们创建一个users表并执行基本操作:插入、读取、更新、删除。
迁移:创建表
\n\n在sqlx中,迁移是单独的SQL文件。创建一个migrations文件夹和一个文件
博客
书籍推荐
推荐阅读