色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在Rust中連接和使用MySQL數據庫

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

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

安裝 mysql 模塊

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

cargo install mysql

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

連接MySQL數據庫

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

在Rust程序中使用mysql crate庫連接MySQL數據庫,需要進行以下步驟:

    1. 導入mysql crate
    1. 使用mysql::OptsBuilder設置MySQL連接選項
    1. 使用mysql::Pool::new創建MySQL連接池
    1. 使用pool.get_conn()獲取MySQL連接,并進行一些操作,例如插入、查詢等
    1. 使用pool.disconnect()斷開MySQL連接

下面是連接MySQL數據庫的示例代碼:

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();
}

以上代碼創建了一個MySQL連接池,并從連接池中獲取一個MySQL連接,查詢了一個名為users的表,并將結果作為元素進行遍歷。

Rust使用MySQL的進階用法

事務(Transaction)

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

使用以下代碼示例可以體驗事務的實現:

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();
}

以上代碼創建了一個名為users的表,并在事務內分別插入了兩個元素,數據被成功提交到了MySQL數據庫,我們看到了名為AliceBob的條目。

異步IO

Rust語言具有異步IO處理的優勢。在Rust中使用MySQL異步IO時,可以使用tokio-mysql crate來實現。tokio-mysql crate是一個基于Tokio實現的異步MySQL數據庫客戶端。

下面是使用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(())
}

它創建了一個名為students的表,并插入了一個名為Alice年齡為23的元素,然后遍歷該表并打印結果。

Rust使用MySQL的最佳實踐

連接池

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

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注入攻擊是一個重要的安全問題。在Rust中使用mysql crate,可以使用mysql::from_valuemysql::Value::from方法來避免SQL注入攻擊。

在Rust中,需要使用以下代碼實現SQL語句中的參數綁定:

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

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

在將參數傳遞給SQL查詢時,需要使用mysql::Value::from方法將變量轉換為mysql::Value類型,以防止SQL注入攻擊。要從mysql::Value轉換回常規變量,可以使用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執行和結果處理

在Rust中,可以使用mysql::Conn::querymysql::Conn::exec_itermysql::Conn::prep_exec等方法來執行SQL語句。但是,這些方法返回的結果類型有很大不同。query方法返回包含所有結果集的Vec類型,而exec_iter方法返回mysql::Row類型的迭代器。最后,prep_exec方法是最常用的方法,它可以綁定參數,并類似于通過命令行客戶端發送的查詢,并返回mysql::QueryResult類型。如果要提取單個結果,可以使用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();
}

結論

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7618

    瀏覽量

    138654
  • 編程語言
    +關注

    關注

    10

    文章

    1952

    瀏覽量

    35263
  • 管理器
    +關注

    關注

    0

    文章

    249

    瀏覽量

    18703
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    96

    瀏覽量

    9534
  • Rust
    +關注

    關注

    1

    文章

    231

    瀏覽量

    6724
收藏 人收藏

    評論

    相關推薦

    labview 連接mysql 數據庫的問題

    `我根據網絡上的教程想用labsql 做個連接mysql的vi,但是就是連接不上數據庫。(已經新建數據源DSN)求教下,字符串 3,4 是不
    發表于 01-07 22:06

    labview連接mysql數據庫的問題

    這個ODBC數據流已經成功設置了,為什么用labview連接mysql數據庫就出現這個錯誤呢?望大神解答,謝謝啦!
    發表于 08-19 08:30

    如何使用原生hqc連接MySQL數據庫

    springboot項目中使用原生hqc連接MySQL數據庫
    發表于 06-08 12:12

    c#如何連接mysql數據庫

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

    python如何連接MySql數據庫

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

    ESP8266如何連接mysql數據庫

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

    PHP教程之PHP與MySQL數據庫連接的資料說明

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

    華為云數據庫-RDS for MySQL數據庫

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

    MySQL數據庫管理與應用

    討論MySQL數據庫的管理和應用。 管理MySQL數據庫 在管理MySQL數據庫之前,我們需要了
    的頭像 發表于 08-28 17:15 ?1079次閱讀

    mysql數據庫基礎命令

    MySQL是一個流行的關系型數據庫管理系統,經常用于存儲、管理和操作數據。在本文中,我們將詳細介紹MySQL的基礎命令,并提供與每個命令相關的詳細解釋。 登錄
    的頭像 發表于 12-06 10:56 ?711次閱讀

    eclipse怎么連接數據庫mysql

    連接Eclipse和MySQL數據庫可以通過JDBC(Java Database Connectivity)來實現。以下是詳細步驟: 下載并安裝MySQL
    的頭像 發表于 12-06 11:06 ?1402次閱讀

    數據庫數據恢復—Mysql數據庫表記錄丟失的數據恢復流程

    Mysql數據庫故障: Mysql數據庫表記錄丟失。 Mysql數據庫故障表現: 1、
    的頭像 發表于 12-16 11:05 ?305次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—<b class='flag-5'>Mysql</b><b class='flag-5'>數據庫</b>表記錄丟失的<b class='flag-5'>數據</b>恢復流程

    MySQL數據庫的安裝

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

    適用于MySQL和MariaDB的Python連接器:可靠的MySQL數據連接器和數據庫

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

    從Delphi、C++ Builder和Lazarus連接MySQL數據庫

    ? 從 Delphi、C++ Builder 和 Lazarus 連接MySQL 數據庫 MySQL 數據訪問組件(MyDAC)是一個組
    的頭像 發表于 01-20 13:47 ?257次閱讀
    從Delphi、C++ Builder和Lazarus<b class='flag-5'>連接</b>到<b class='flag-5'>MySQL</b><b class='flag-5'>數據庫</b>
    主站蜘蛛池模板: 国产AV精品无码免费看 | 91视频18 | 受被三个攻各种道具PLAY | 一品道门在线视频 | 亚洲精品成人AV在线观看爽翻 | 久久青草在线视频精品 | 抽插嫩B乳无码漫 | 一本色道久久88加勒比—综合 | 美女的让男人桶爽网站 | 饥渴的护士自慰被发现 | 久久xxxx | 中文在线中文资源 | 国产AV视频二区在线观看 | 无码射肉在线播放视频 | 中文字幕日本久久2019 | 国产成人无码一区AV在线观看 | 被老头下药玩好爽 | 色姣姣狠狠撩综合网 | 国产精品 中文字幕 亚洲 欧美 | 国产欧美日韩国产高清 | 午夜视频体内射.COM.COM | 成人久久欧美日韩一区二区三区 | 久久成人a毛片免费观看网站 | 黑人性xxx | 久久精品视频在线看15 | 亚洲色在线 | 爱豆剧果冻传媒在线播放 | 亚洲国产货青视觉盛宴 | 久久久久夜| 热综合一本伊人久久精品 | 狠狠色综合久久婷婷 | 欧美成人精品高清在线观看 | 国产探花在线精品一区二区 | 国产午夜精品自在自线之la | 国产精品美女WWW爽爽爽视频 | 果冻传媒9CM在线观看 | 国产精品青青在线麻豆 | 欧美一区二区三区激情视频 | 亚洲黄色免费在线观看 | 精品国产自在现线拍400部 | 免费 高清 中文在线观看 |