chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

科技綠洲 ? 來(lái)源:TinyZ ? 作者:TinyZ ? 2023-09-30 17:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

安裝 mysql 模塊

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

cargo install mysql

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

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

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

在Rust程序中使用mysql crate庫(kù)連接MySQL數(shù)據(jù)庫(kù),需要進(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)行一些操作,例如插入、查詢(xún)等
    1. 使用pool.disconnect()斷開(kāi)MySQL連接

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

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連接,查詢(xún)了一個(gè)名為users的表,并將結(jié)果作為元素進(jìn)行遍歷。

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

事務(wù)(Transaction)

為了保證MySQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致性,我們通常需要使用事務(wù)(Transaction)。在Rust中,可以使用MySQL的事務(wù)功能并結(jié)合mysql::Transaction來(lái)實(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ù)庫(kù),我們看到了名為AliceBob的條目。

異步IO

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

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

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è)重要的安全問(wèn)題。在Rust中使用mysql crate,可以使用mysql::from_valuemysql::Value::from方法來(lái)避免SQL注入攻擊。

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

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

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

在將參數(shù)傳遞給SQL查詢(xún)時(shí),需要使用mysql::Value::from方法將變量轉(zhuǎn)換為mysql::Value類(lèi)型,以防止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等方法來(lái)執(zhí)行SQL語(yǔ)句。但是,這些方法返回的結(jié)果類(lèi)型有很大不同。query方法返回包含所有結(jié)果集的Vec類(lèi)型,而exec_iter方法返回mysql::Row類(lèi)型的迭代器。最后,prep_exec方法是最常用的方法,它可以綁定參數(shù),并類(lèi)似于通過(guò)命令行客戶(hù)端發(fā)送的查詢(xún),并返回mysql::QueryResult類(lèi)型。如果要提取單個(gè)結(jié)果,可以使用mysql::QueryResult的方法mysql::QueryResult::next來(lái)獲取。

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

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

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

    關(guān)注

    183

    文章

    7634

    瀏覽量

    143865
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1957

    瀏覽量

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

    關(guān)注

    0

    文章

    264

    瀏覽量

    19391
  • MYSQL數(shù)據(jù)庫(kù)

    關(guān)注

    0

    文章

    96

    瀏覽量

    10102
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    237

    瀏覽量

    7393
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    labview 連接mysql 數(shù)據(jù)庫(kù)的問(wèn)題

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

    labview連接mysql數(shù)據(jù)庫(kù)的問(wèn)題

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

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

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

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

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

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

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

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

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

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

    本文檔的主要內(nèi)容詳細(xì)介紹的是PHP教程之PHP與MySQL數(shù)據(jù)庫(kù)連接的資料說(shuō)明包括了:1.web數(shù)據(jù)庫(kù)架構(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ù)庫(kù)</b><b class='flag-5'>連接</b>的資料說(shuō)明

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

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

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

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

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

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

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

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

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

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

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

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

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

    和 Linux 的 wheel 包分發(fā)。 直接連接 該解決方案使您能夠通過(guò) TCP/IP 建立與 MySQL 或者 MariaDB 數(shù)據(jù)庫(kù)服務(wù)器的直接連接,而無(wú)需
    的頭像 發(fā)表于 01-17 12:18 ?720次閱讀
    適用于<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ù)庫(kù)</b>

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

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