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