0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Rust中連接和使用MySQL數(shù)據(jù)庫

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-30 17:05 ? 次閱讀

MySQL是一個(gè)廣泛使用的關(guān)系型數(shù)據(jù)庫,Rust作為一門相對較新的系統(tǒng)級編程語言,具有C語言般的高性能、安全、并發(fā)等特性,因此與MySQL一起使用是一種非常有趣的選擇。在本教程中,我們將手把手地展示如何在Rust中連接和使用MySQL數(shù)據(jù)庫。

安裝 mysql 模塊

這里我們假設(shè)你已經(jīng)安裝了Rust編程語言工具鏈,在本教程中,我們將使用mysql crate來連接和使用MySQL數(shù)據(jù)庫。要安裝mysql crate,我們可以使用Rust語言包管理器cargo,只需在終端中輸入以下命令:

cargo install mysql

安裝成功后,我們可以開始嘗試連接MySQL數(shù)據(jù)庫了。

連接MySQL數(shù)據(jù)庫

首先,我們需要安裝和配置MySQL數(shù)據(jù)庫,以便在Rust程序中進(jìn)行連接。安裝和配置MySQL在此處不做敘述。

在Rust程序中使用mysql crate庫連接MySQL數(shù)據(jù)庫,需要進(jìn)行以下步驟:

    1. 導(dǎo)入mysql crate
    1. 使用mysql::OptsBuilder設(shè)置MySQL連接選項(xiàng)
    1. 使用mysql::Pool::new創(chuàng)建MySQL連接池
    1. 使用pool.get_conn()獲取MySQL連接,并進(jìn)行一些操作,例如插入、查詢等
    1. 使用pool.disconnect()斷開MySQL連接

下面是連接MySQL數(shù)據(jù)庫的示例代碼:

use mysql::*;

fn main() {
    let opts = OptsBuilder::new()
        .ip_or_hostname(Some("localhost"))
        .user(Some("root"))
        .pass(Some("password"))
        .db_name(Some("test"))
        .tcp_port(3306);

    let pool = Pool::new(opts).unwrap();
    let mut conn = pool.get_conn().unwrap();

    let result = conn.query_first("SELECT * FROM users").unwrap();
    for row in result {
        let name: String = row.get("name").unwrap();
        let age: i32 = row.get("age").unwrap();
        println!("{} is {} years old", name, age);
    }

    pool.disconnect().unwrap();
}

以上代碼創(chuàng)建了一個(gè)MySQL連接池,并從連接池中獲取一個(gè)MySQL連接,查詢了一個(gè)名為users的表,并將結(jié)果作為元素進(jìn)行遍歷。

Rust使用MySQL的進(jìn)階用法

事務(wù)(Transaction)

為了保證MySQL數(shù)據(jù)庫中的數(shù)據(jù)一致性,我們通常需要使用事務(wù)(Transaction)。在Rust中,可以使用MySQL的事務(wù)功能并結(jié)合mysql::Transaction來實(shí)現(xiàn)。

使用以下代碼示例可以體驗(yàn)事務(wù)的實(shí)現(xiàn):

use mysql::*;

fn main() {
    let opts = OptsBuilder::new()
        .ip_or_hostname(Some("localhost"))
        .user(Some("root"))
        .pass(Some("password"))
        .db_name(Some("test"))
        .tcp_port(3306);

    let pool = Pool::new(opts).unwrap();
    let mut conn = pool.get_conn().unwrap();

    // Start a transaction
    let mut transaction = conn.start_transaction(TxOpts::default()).unwrap();

    // Insert data into a table
    transaction .prep_exec("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 23)).unwrap();
    transaction.prep_exec("INSERT INTO users (name, age) VALUES (?, ?)", ("Bob", 25)).unwrap();

    // Commit a transaction
    transaction.commit().unwrap();

    // Select data from a table let result = conn.query("SELECT * FROM users").unwrap();
    for row in result {
        let name: String = row.get("name").unwrap();
        let age: i32 = row.get("age").unwrap();
        println!("{} is {} years old", name, age);
    }

    pool.disconnect().unwrap();
}

以上代碼創(chuàng)建了一個(gè)名為users的表,并在事務(wù)內(nèi)分別插入了兩個(gè)元素,數(shù)據(jù)被成功提交到了MySQL數(shù)據(jù)庫,我們看到了名為AliceBob的條目。

異步IO

Rust語言具有異步IO處理的優(yōu)勢。在Rust中使用MySQL異步IO時(shí),可以使用tokio-mysql crate來實(shí)現(xiàn)。tokio-mysql crate是一個(gè)基于Tokio實(shí)現(xiàn)的異步MySQL數(shù)據(jù)庫客戶端。

下面是使用tokio-mysql crate的示例代碼:

use std::str::FromStr;

use tokio::runtime::Builder;
use tokio::time::Duration;
use tokio_mysql::{prelude::*, Error, Opts, Pool};

#[tokio::main]
async fn main() - > Result< (), Error > {
    let opts = Opts::from_url("mysql://root:password@localhost:3306/test")?;
    let pool = Pool::new(opts);

    let pool = match pool {
        Ok(p) = > p,
        Err(e) = > return Err(e),
    };

    let mut conn = pool.get_conn().await?;

    conn.query_drop("CREATE TABLE IF NOT EXISTS students (
            id INT PRIMARY KEY NOT NULL,
            name TEXT NOT NULL,
            age INT NOT NULL
        )")
        .await?;

    let id = 1;
    let name = "Alice";
    let age = 23;

    conn.exec_drop(
            format!(
                "INSERT INTO students (id, name, age) VALUES ({}, "{}", {})",
                id, name, age
            )
            .as_str()
        )
        .await?;

    let mut conn2 = pool.get_conn().await?;
    let result = conn2
        .query_iter(
            String::from("SELECT * FROM students")
                .as_str(),
        )
        .await?;

    for row in result {
        let id: u32 = row.unwrap().take("id").unwrap().as_integer().unwrap().try_into().unwrap();
        let name: &str = row.unwrap().take("name").unwrap().as_sql_str();
        let age: u32 = row.unwrap().take("age").unwrap().as_integer().unwrap().try_into().unwrap();

        println!("{} is {} years old", name, age);
    }

    Ok(())
}

它創(chuàng)建了一個(gè)名為students的表,并插入了一個(gè)名為Alice年齡為23的元素,然后遍歷該表并打印結(jié)果。

Rust使用MySQL的最佳實(shí)踐

連接池

在連接MySQL數(shù)據(jù)庫時(shí),使用連接池是非常重要的。連接池是一個(gè)預(yù)先創(chuàng)建的連接集合,由于預(yù)先初始化了這些連接,因此在保持連接上下文的情況下執(zhí)行多個(gè)操作變得更加輕松。在Rust中使用mysql::Pool連接MySQL數(shù)據(jù)庫是非常常見的。

let opts = OptsBuilder::new()
    .ip_or_hostname(Some("localhost"))
    .user(Some("root"))
    .pass(Some("password"))
    .db_name(Some("test"))
    .tcp_port(3306);

let pool = Pool::new(opts).unwrap();

避免SQL注入

避免SQL注入攻擊是一個(gè)重要的安全問題。在Rust中使用mysql crate,可以使用mysql::from_valuemysql::Value::from方法來避免SQL注入攻擊。

在Rust中,需要使用以下代碼實(shí)現(xiàn)SQL語句中的參數(shù)綁定:

let name = "Alice";
let age = 23;

conn.prep_exec("INSERT INTO students (name, age) VALUES (?, ?)", (name, age),).unwrap();

在將參數(shù)傳遞給SQL查詢時(shí),需要使用mysql::Value::from方法將變量轉(zhuǎn)換為mysql::Value類型,以防止SQL注入攻擊。要從mysql::Value轉(zhuǎn)換回常規(guī)變量,可以使用mysql::from_value方法。使用以下示例代碼:

use mysql::*;

fn main() {
    let result: Vec< Row > = conn.query("SELECT * FROM students WHERE age >= ?", (age.into(),)).unwrap();
    for row in result {
        let age: i32 = from_value(row.get("age").unwrap());
        let name: String = from_value(row.get("name").unwrap());
        println!("{} is {} years old", name, age);
    }
}

SQL執(zhí)行和結(jié)果處理

在Rust中,可以使用mysql::Conn::query,mysql::Conn::exec_itermysql::Conn::prep_exec等方法來執(zhí)行SQL語句。但是,這些方法返回的結(jié)果類型有很大不同。query方法返回包含所有結(jié)果集的Vec類型,而exec_iter方法返回mysql::Row類型的迭代器。最后,prep_exec方法是最常用的方法,它可以綁定參數(shù),并類似于通過命令行客戶端發(fā)送的查詢,并返回mysql::QueryResult類型。如果要提取單個(gè)結(jié)果,可以使用mysql::QueryResult的方法mysql::QueryResult::next來獲取。

使用以下代碼示例說明不同方法的使用:

use mysql::*;

fn main() {
    let result: Vec< Row > = conn.query("SELECT * FROM students WHERE age >= ?", (age.into(),)).unwrap();
    for row in result {
        let age: i32 = from_value(row.get("age").unwrap());
        let name: String = from_value(row.get("name").unwrap());
        println!("{} is {} years old", name, age);
    }

    let mut iter = conn.exec_iter("SELECT age FROM students WHERE name = "Alice"").unwrap();
    while let Some(result) = iter.next() {
        let age: i32 = from_value(result.unwrap());
        println!("Alice is {} years old", age);
    }

    conn.prep_exec("INSERT INTO students (name, age) VALUES (?, ?)",(name, age),).unwrap();
}

結(jié)論

本教程介紹了如何在Rust中連接和使用MySQL數(shù)據(jù)庫。我們學(xué)習(xí)了使用mysql crate連接MySQL數(shù)據(jù)庫,并實(shí)現(xiàn)了一些常見用例,例如事務(wù)、異步IO等。此外,我們使用連接池、避免SQL注入技巧,并使用了不同的SQL執(zhí)行和結(jié)果處理方法。如果你正在使用Rust編程語言,那么通過學(xué)習(xí)本教程,你將掌握基本和高級的連接和使用MySQL技巧。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7626

    瀏覽量

    139617
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1952

    瀏覽量

    35670
  • 管理器
    +關(guān)注

    關(guān)注

    0

    文章

    250

    瀏覽量

    18850
  • MYSQL數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    0

    文章

    96

    瀏覽量

    9668
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    6873
收藏 0人收藏

    評論

    相關(guān)推薦

    labview 連接mysql 數(shù)據(jù)庫的問題

    `我根據(jù)網(wǎng)絡(luò)上的教程想用labsql 做個(gè)連接mysql的vi,但是就是連接不上數(shù)據(jù)庫。(已經(jīng)新建數(shù)據(jù)源DSN)求教下,字符串 3,4 是不
    發(fā)表于 01-07 22:06

    labview連接mysql數(shù)據(jù)庫的問題

    這個(gè)ODBC數(shù)據(jù)流已經(jīng)成功設(shè)置了,為什么用labview連接mysql數(shù)據(jù)庫就出現(xiàn)這個(gè)錯(cuò)誤呢?望大神解答,謝謝啦!
    發(fā)表于 08-19 08:30

    如何使用原生hqc連接MySQL數(shù)據(jù)庫

    springboot項(xiàng)目中使用原生hqc連接MySQL數(shù)據(jù)庫
    發(fā)表于 06-08 12:12

    c#如何連接mysql數(shù)據(jù)庫

    (visual studio)c#連接mysql數(shù)據(jù)庫
    發(fā)表于 06-13 20:56

    python如何連接MySql數(shù)據(jù)庫

    Python入門(python連接MySql數(shù)據(jù)庫)還能怎么記,大開眼界!
    發(fā)表于 06-14 07:48

    ESP8266如何連接mysql數(shù)據(jù)庫

    各位大神,我試圖用ESP8266 連接mysql ,將溫濕度傳感器的數(shù)據(jù),寫入數(shù)據(jù)庫。mysql數(shù)據(jù)庫
    發(fā)表于 01-12 09:22

    PHP教程之PHP與MySQL數(shù)據(jù)庫連接的資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是PHP教程之PHP與MySQL數(shù)據(jù)庫連接的資料說明包括了:1.web數(shù)據(jù)庫架構(gòu),2.建立一個(gè)連接,3.選擇
    發(fā)表于 04-18 17:04 ?8次下載
    PHP教程之PHP與<b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>連接</b>的資料說明

    華為云數(shù)據(jù)庫-RDS for MySQL數(shù)據(jù)庫

    (for MySQL)為輔。 MySQL數(shù)據(jù)庫是全球最受歡迎的一種數(shù)據(jù)庫,它是屬于 Oracle旗下的一款產(chǎn)品,MySQL是一種關(guān)系型
    的頭像 發(fā)表于 10-27 11:06 ?1696次閱讀

    MySQL數(shù)據(jù)庫管理與應(yīng)用

    討論MySQL數(shù)據(jù)庫的管理和應(yīng)用。 管理MySQL數(shù)據(jù)庫 在管理MySQL數(shù)據(jù)庫之前,我們需要了
    的頭像 發(fā)表于 08-28 17:15 ?1143次閱讀

    mysql數(shù)據(jù)庫基礎(chǔ)命令

    MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),經(jīng)常用于存儲(chǔ)、管理和操作數(shù)據(jù)。在本文中,我們將詳細(xì)介紹MySQL的基礎(chǔ)命令,并提供與每個(gè)命令相關(guān)的詳細(xì)解釋。 登錄
    的頭像 發(fā)表于 12-06 10:56 ?759次閱讀

    eclipse怎么連接數(shù)據(jù)庫mysql

    連接Eclipse和MySQL數(shù)據(jù)庫可以通過JDBC(Java Database Connectivity)來實(shí)現(xiàn)。以下是詳細(xì)步驟: 下載并安裝MySQL
    的頭像 發(fā)表于 12-06 11:06 ?1500次閱讀

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—Mysql數(shù)據(jù)庫表記錄丟失的數(shù)據(jù)恢復(fù)流程

    Mysql數(shù)據(jù)庫故障: Mysql數(shù)據(jù)庫表記錄丟失。 Mysql數(shù)據(jù)庫故障表現(xiàn): 1、
    的頭像 發(fā)表于 12-16 11:05 ?442次閱讀
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—<b class='flag-5'>Mysql</b><b class='flag-5'>數(shù)據(jù)庫</b>表記錄丟失的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)流程

    MySQL數(shù)據(jù)庫的安裝

    MySQL數(shù)據(jù)庫的安裝 【一】各種數(shù)據(jù)庫的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】
    的頭像 發(fā)表于 01-14 11:25 ?378次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)庫</b>的安裝

    適用于MySQL和MariaDB的Python連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)庫

    和 Linux 的 wheel 包分發(fā)。 直接連接 該解決方案使您能夠通過 TCP/IP 建立與 MySQL 或者 MariaDB 數(shù)據(jù)庫服務(wù)器的直接連接,而無需
    的頭像 發(fā)表于 01-17 12:18 ?336次閱讀
    適用于<b class='flag-5'>MySQL</b>和MariaDB的Python<b class='flag-5'>連接</b>器:可靠的<b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>連接</b>器和<b class='flag-5'>數(shù)據(jù)庫</b>

    從Delphi、C++ Builder和Lazarus連接MySQL數(shù)據(jù)庫

    ? 從 Delphi、C++ Builder 和 Lazarus 連接MySQL 數(shù)據(jù)庫 MySQL 數(shù)據(jù)訪問組件(MyDAC)是一個(gè)組
    的頭像 發(fā)表于 01-20 13:47 ?469次閱讀
    從Delphi、C++ Builder和Lazarus<b class='flag-5'>連接</b>到<b class='flag-5'>MySQL</b><b class='flag-5'>數(shù)據(jù)庫</b>

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品