一、环境准备
1.1 Rust 工具链安装
安装方法:
# 安装依赖
sudo apt update && sudo apt install -y build-essential curl git
# 安装 rustup(Rust 版本管理工具)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 配置环境变量
source $HOME/.cargo/env
验证安装:
rustc --version # 应显示 Rust 编译器版本
cargo --version # 应显示包管理器版本
1.2 数据库安装
1.2.1 SQLite(嵌入式数据库)
sudo apt install sqlite3
1.2.2 PostgreSQL(生产级数据库)
sudo apt install postgresql postgresql-contrib
sudo -u postgres createuser --interactive
sudo -u postgres createdb testdb
二、数据库连接开发
2.1 同步数据库操作(SQLite)
添加依赖(Cargo.toml):
[dependencies]
rusqlite = "0.26.0"
基础操作示例:
use rusqlite::{Connection, params};
fn main() -> rusqlite::Result<()> {
let conn = Connection::open("test.db")?;
// 创建表
conn.execute(
"CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
)",
[],
)?;
// 插入数据
conn.execute(
"INSERT INTO users (name, age) VALUES (?1, ?2)",
params!["Alice", 30],
)?;
// 查询数据
let mut stmt = conn.prepare("SELECT id, name, age FROM users")?;
let user_iter = stmt.query_map([], |row| {
Ok(User {
id: row.get(0)?,
name: row.get(1)?,
age: row.get(2)?,
})
})?;
for user in user_iter {
println!("User: {:?}", user?);
}
Ok(())
}
#[derive(Debug)]
struct User {
id: i32,
name: String,
age: i32,
}
2.2 异步数据库操作(PostgreSQL)
添加依赖(Cargo.toml):
[dependencies]
tokio = { version = "1.0", features = ["full"] }
tokio-postgres = "0.7"
异步连接示例:
use tokio_postgres::{NoTls, Error};
#[tokio::main]
async fn main() -> Result<(), Error> {
let (client, connection) = tokio_postgres::connect(
"host=localhost user=postgres dbname=testdb",
NoTls,
)
.await?;
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("Connection error: {}", e);
}
});
// 执行查询
let rows = client
.query("SELECT id, name FROM users", &[])
.await?;
for row in rows {
let id: i32 = row.get(0);
let name: String = row.get(1);
println!("ID: {}, Name: {}", id, name);
}
Ok(())
}
三、开发最佳实践
3.1 安全策略
-
参数化查询(防 SQL 注入):
let name = "Alice"; conn.execute( "INSERT INTO users (name) VALUES (?1)", params![name], )?;
-
错误处理:
use thiserror::Error; #[derive(Error, Debug)] enum DbError { #[error("Connection failed")] ConnectionError(#[from] rusqlite::Error), #[error("Query error: {0}")] QueryError(String), }
3.2 性能优化
-
连接池配置(使用
r2d2
):use r2d2::Pool; use r2d2_sqlite::SqliteConnectionManager; let manager = SqliteConnectionManager::file("test.db"); let pool = Pool::new(manager).unwrap();
-
批量操作:
let mut tx = conn.transaction()?; for user in users { tx.execute( "INSERT INTO users (name, age) VALUES (?1, ?2)", params![user.name, user.age], )?; } tx.commit()?;
四、麒麟系统适配
4.1 文件系统权限
use std::fs;
// 设置数据库文件权限
fs::set_permissions("test.db", fs::Permissions::from_mode(0o600))?;
4.2 系统服务集成
创建 systemd 服务文件:
# /etc/systemd/system/rust-db.service
[Service]
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/cargo run --release
Restart=always
User=kylin
五、部署与运维
5.1 编译优化
cargo build --release # 生成优化后的二进制文件
5.2 依赖打包
使用 cargo-bundle
创建安装包:
cargo install cargo-bundle
cargo bundle --release
六、常见问题解决
问题现象 | 解决方案 |
---|---|
数据库连接失败 | 检查 pg_hba.conf 配置,允许本地连接 |
性能瓶颈 | 启用 PostgreSQL 的 shared_buffers 和 work_mem 参数 |
内存泄漏 | 使用 valgrind --tool=memcheck 检测内存问题 |
跨平台兼容性 | 在 Cargo.toml 中指定目标平台 x86_64-unknown-linux-gnu |
七、扩展应用场景
- Web 服务集成:使用 Actix-web 或 Rocket 框架构建 REST API
- 分布式事务:集成 Seata-rs 实现跨服务事务
- 数据加密:使用
ring
库实现字段级加密