Rust与CentOS数据库交互指南
在CentOS上使用Rust与数据库交互前,需完成以下基础配置:
rustup安装Rust编译器及Cargo包管理器。在终端执行以下命令:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
验证安装:rustc --version(显示版本号则表示成功)。sudo dnf install -y mysql-server mysql-client mysql-devel
启动MySQL服务并设置开机自启:sudo systemctl start mysqld
sudo systemctl enable mysqld
对于PostgreSQL,替换为对应命令:sudo dnf install -y postgresql-server postgresql-contrib postgresql-devel
sudo postgresql-setup --initdb --unit postgresql
sudo systemctl start postgresql
sudo systemctl enable postgresql
根据目标数据库类型,在Cargo.toml中添加对应的客户端库:
mysql(同步)或mysql_async(异步)库。[dependencies]
mysql = "20.1" # 同步操作
# 或
mysql_async = "0.32" # 异步操作(需配合tokio)
tokio-postgres(异步)或diesel(ORM,支持同步/异步)。[dependencies]
tokio-postgres = { version = "0.7", features = ["with-uuid-1", "with-serde_json-1"] } # 异步
# 或
diesel = { version = "1.4", features = ["postgres", "chrono"] } # ORM(需额外启用chrono)
rusqlite库(轻量级嵌入式数据库)。[dependencies]
rusqlite = "0.26"
使用连接池管理数据库连接,提升性能(避免频繁创建/销毁连接)。以MySQL同步操作为例:
use mysql::*;
use mysql::prelude::*;
fn main() {
// 1. 构建连接字符串(替换为实际信息)
let url = "mysql://root:your_password@localhost:3306/your_database";
// 2. 创建连接池
let pool = Pool::new(url).expect("Failed to create connection pool");
// 3. 从池中获取连接
let mut conn = pool.get_conn().expect("Failed to get connection from pool");
// 4. 执行查询(后续步骤)
}
对于PostgreSQL异步操作(需启用tokio特性):
use tokio_postgres::{NoTls, Error};
use tokio::runtime::Runtime;
fn main() -> Result<(), Error> {
// 1. 构建连接字符串
let conn_str = "host=localhost user=postgres dbname=your_database password=your_password";
// 2. 创建Tokio运行时(异步操作必需)
let rt = Runtime::new()?;
rt.block_on(async {
// 3. 建立连接
let (client, connection) = tokio_postgres::connect(conn_str, NoTls).await?;
// 4. 后台运行连接任务(避免阻塞)
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("Connection error: {}", e);
}
});
// 5. 执行查询(后续步骤)
Ok(())
})
}
// 查询所有用户(返回Vec<Row>)
let users: Vec<Row> = conn.query("SELECT id, name, age FROM users").expect("Query failed");
// 遍历结果(需手动提取字段类型)
for row in users {
let id: i32 = row.get("id");
let name: String = row.get("name");
let age: i32 = row.get("age");
println!("ID: {}, Name: {}, Age: {}", id, name, age);
}
// 插入数据(带参数,防止SQL注入)
let insert_result = conn.exec_drop(
"INSERT INTO users (name, age) VALUES (:name, :age)",
params! { "name" => "Alice", "age" => 25 }
).expect("Insert failed");
println!("Inserted {} rows", insert_result);
// 查询所有用户(返回Future,需在async块中执行)
let rows = client.query("SELECT id, name, email FROM users", &[]).await?;
// 遍历结果(自动推断类型)
for row in rows {
let id: i32 = row.get(0);
let name: &str = row.get(1);
let email: &str = row.get(2);
println!("ID: {}, Name: {}, Email: {}", id, name, email);
}
// 插入数据(使用$1, $2占位符)
let insert_result = client.execute(
"INSERT INTO users (name, email) VALUES ($1, $2)",
&["Bob", "bob@example.com"]
).await?;
println!("Inserted {} rows", insert_result);
为提升代码可读性与可维护性,建议将查询结果映射到自定义结构体。以MySQL为例:
#[derive(Debug, PartialEq)]
struct User {
id: i32,
name: String,
age: i32,
}
// 查询并映射到结构体
let users: Vec<User> = conn.query_map(
"SELECT id, name, age FROM users",
|row| User {
id: row.get("id"),
name: row.get("name"),
age: row.get("age"),
}
).expect("Query map failed");
for user in users {
println!("{:?}", user);
}
sudo systemctl status mysqld)、连接字符串是否正确(用户名、密码、主机、端口、数据库名)。GRANT ALL PRIVILEGES ON your_database.* TO 'root'@'%')。openssl),需安装对应开发库(sudo dnf install openssl-devel)。tls特性、PostgreSQL的native_tls),避免明文传输。通过以上步骤,即可在CentOS环境下使用Rust与数据库进行高效、安全的交互。根据项目需求选择同步或异步库,并遵循最佳实践(如使用连接池、参数化查询)提升代码质量。