Rust 教程 - 使用 sqlx 操作數據庫

一. 介紹

sqlx 是一個純 rust 代碼實現的異步數據庫客戶端,支持 MySQL、PostgreSQL、MSSQL、SQLite 主流數據庫。

二. 準備工作

2.1 創建項目

cargo new example-rs
     Created binary (application) `example-rs` package

2.2 添加依賴

添加 sqlx 和 async-std 依賴

[package]
name = "example-rs"
version = "0.1.0"
edition = "2018"
[dependencies]
sqlx = { version = "0.5.7"features = [ "mysql" ,"runtime-async-std-native-tls"] }
async-std = { version = "1.6", features = [ "attributes" ] }

2.3 創建數據庫和表

創建一個 test 數據庫,並在 test 庫中創建 book 表,sql 語句如下

//創建數據庫
CREATE DATABASE test default character set utf8mb4 collate utf8mb4_unicode_ci;
//選擇剛創建的test數據庫
USE test;
//創建表
CREATE TABLE book(id int NOT NULL PRIMARY KEY AUTO_INCREMENT, name varchar(255) NOT NULL, author varchar(255) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

三. 創建數據庫連接

初始化 MySQL 數據庫連接

use sqlx::mysql::MySqlPoolOptions;
use sqlx::MySqlPool;
use sqlx::prelude::*;
use sqlx::FromRow;
#[async_std::main]
async fn main() -> Result<(), sqlx::Error> {
    //創建數據庫連接,username數據庫用戶名,password數據庫密碼,hostname數據庫host
    let pool = MySqlPool::connect("mysql://username:password@hostname/test").await?;
    Ok(())
}

四. ORM 操作

創建 Book 模型代碼

#[derive(sqlx::FromRow)]
pub struct Book {
    pub id: i64,
    pub name: String,
    pub author: String,
}

五. 插入數據

let book = Book {
  id: 0,
  name: String::from("Rust 實踐"),
  author: String::from("無名氏"),
};
    //插入數據
let book_id = sqlx::query(r#"INSERT INTO book(name, author) VALUES(?, ?)"#)
  .bind(book.name)
  .bind(book.author)
  .execute(&pool).await?.last_insert_id();
use sqlx::mysql::MySqlPoolOptions;
use sqlx::MySqlPool;
use sqlx::prelude::*;
use sqlx::FromRow;
#[derive(sqlx::FromRow)]
pub struct Book {
    pub id: i64,
    pub name: String,
    pub author: String,
}
#[async_std::main]
async fn main() -> Result<(), sqlx::Error> {
    //創建數據庫連接,username數據庫用戶名,password數據庫密碼,hostname數據庫host
    let pool = MySqlPool::connect("mysql://username:password@hostname/test").await?;
    let book = Book {
        id: 0,
        name: String::from("Rust 實踐"),
        author: String::from("無名氏"),
    };
    //插入數據
    let book_id = sqlx::query(r#"INSERT INTO book(name, author) VALUES(?, ?)"#)
        .bind(book.name)
        .bind(book.author)
        .execute(&pool).await?.last_insert_id();
    //打印剛插入的book主鍵ID
    println!("book_id: {}", book_id);
    Ok(())
}

六. 數據讀取

//執行SELECT語句讀取數據
let book = sqlx::query_as::<_, Book>("SELECT * FROM book WHERE id=?")
        .bind(1)
        .fetch_one(&pool).await?;
use sqlx::mysql::MySqlPoolOptions;
use sqlx::MySqlPool;
use sqlx::prelude::*;
use sqlx::FromRow;
#[derive(sqlx::FromRow)]
pub struct Book {
    pub id: i64,
    pub name: String,
    pub author: String,
}
#[async_std::main]
async fn main() -> Result<(), sqlx::Error> {
    //創建數據庫連接,username數據庫用戶名,password數據庫密碼,hostname數據庫host
    let pool = MySqlPool::connect("mysql://username:password@hostname/test").await?;
    let book = Book {
        id: 0,
        name: String::from("Rust 實踐"),
        author: String::from("無名氏"),
    };
    //插入數據
    let book_id = sqlx::query(r#"INSERT INTO book(name, author) VALUES(?, ?)"#)
        .bind(book.name)
        .bind(book.author)
        .execute(&pool).await?.last_insert_id();
    //打印剛插入的book主鍵ID
    println!("book_id: {}", book_id);
    let book = sqlx::query_as::<_, Book>("SELECT * FROM book WHERE id=?")
        .bind(1)
        .fetch_one(&pool).await?;
    println!("{}", book.author);
    Ok(())
}

七. 總結

以上內容總結了使用 sqlx 庫對 MySQL 數據庫的操作,可見目前 Rust 的生態越來越好,很多優秀的庫可以很方便的使用,以後會分享更多第三方開源庫的使用教程,屆時大家一起交流。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/dYILIz69ujHZLTxG5cyiTg