锋哥学Rust,第二课:sqlite数据库操作

大家好,这里是锋哥学Rust,第二课:sqlite数据库操作。第一课是hello world。第二课我们来操作一下怎么连接数据库。

有的同学就慌了,锋哥,你怎么不按套路出牌啊。我们都不知道Rust有哪些数据结构,怎么就直接上车开起来了? 我还没学数据类型呢。

不要急,我们一步一步来讲解。

学完第二课,你会非常有成就感。数据库都能玩起来了。有点意思。比撸什么其他枯燥的代码有意思多了。

cargo你应该已经装了,先开一个shell,windows下面powershell, Linux mac下面开任何一个终端。

我们先cargo new rust-sqlite 创建一个新的rust项目

 

然后用你最喜欢的编辑器打开项目, 我用vscode。

 

看到熟悉的Cargo.toml和src目录没有,我们先添加一些我们的依赖到Cargo.toml里面。

Rust管理包的工具是Cargo, Cargo.toml就是写包依赖的地方,如果你用过python, nodejs, java你应该不陌生,就连php 也有composer,这理解起来不算太难吧。

如果还不能理解,那么你可以理解Cargo.toml为配置文件,我们需要什么软件依赖,我们就往里面写。

只要是有货的,都会自动从中央仓库下载回来。

就好比你去吃饭,只要饭点有的菜单,菜单上有的菜,你都可以点。下面还是让我们开始点菜。

教程要用到一个rust 的sqlite 类库:rusqlite

锋哥学Rust,第二课:sqlite数据库操作
锋哥学Rust,第二课:sqlite数据库操作
我们写几行配置到Cargo.toml里面去

[dependencies]

[dependencies.rusqlite]
git="https://github.com/rusqlite/rusqlite"
branch="master"
features = ["bundled"]
一步步来讲解配置文件是什么意思,

首先看括号[dependencies.rusqlite] 这个括号,表示这是一个配置的最小单元,紧随其后的是这个配置单元的具体规则

可以看到git,表示我们依赖是远端的git仓库,branch表示我们追随的是最新的master代码,feature表示我们要启用哪些特性。这里,为了方便构建,我们启用Bundled特性,Rusqlite预构建好so和dll共享链接库,我们用它内置携带的版本,就不用从头配置依赖编译环境了。那会很麻烦,对于我们新手来说太麻烦了,我们搞不了。

好,接下来,我们开始写代码了,往src/main.rs里面塞一些代码

use rusqlite::{params,Connection,Result};

#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    data: Option<Vec<u8>>,
}

fn main() -> Result<()> {
    let conn = Connection::open_in_memory()?;

    conn.execute("CREATE TABLE PERSON(
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        data BLOB)",
         [],
    )?;
    let me = Person {
        id: 0,
        name: "Steven".to_string(),
        data: None,
    };
    conn.execute(
        "INSERT INTO person (name, data) VALUES (?1, ?2)",
        params![me.name, me.data],
    )?;

    let mut stmt = conn.prepare("SELECT id, name, data FROM person")?;
    let person_iter = stmt.query_map([], |row| {
        Ok(Person {
            id: row.get(0)?,
            name: row.get(1)?,
            data: row.get(2)?,
        })
    })?;

    for person in person_iter {
        println!("Found person {:?}", person.unwrap());
    }
    Ok(())
}
接下来执行应用试试, 在shell里面执行 cargo run

如果没有意外,你会看到执行效果

 

  Running `target\debug\rust-sqlite.exe`
Found person Person { id: 1, name: "Steven", data: None }
锋哥学Rust,第二课:sqlite数据库操作
如果需要清理,重新编译,先执行cargo clean清理编译缓存,然后再执行cargo run

 

好了,如果没有意外,你第一个有用的应用程序就跑起来了,是不是很开心?

 

别着急,还有知识点没讲呢。 use 指令,是加载类库用的,多个子组件,用{花括号}隔开

 

#[derive(Debug)] 表示启用 debug 宏,它的作用是让Struct 结构体,可以被Print 打印出来

相当于透视镜。我这样说,不是很专业,但为了能让大家理解,我就不说那种专业的术语,我说人话。

接下来Struct Person 定义了一个结构体,用于存储一条记录,那么一个人的档案记录,肯定有uid,姓名,和他的资料,对吧,所以你看到这里定了三个字段和它的数据类型。

接下来main函数里面,我们做了几件事

连接数据库
创建数据表
插入一条记录
查询记录并print打印
不知道这个简单的程序,大家有没有看懂呢?

如果没看懂,欢迎评论里告诉我。

 

有的同学问:为什么要这么写,我写其他的形式行不行?

很抱歉, 每个语言都有自己的语法,Rust也有它的语法,你要按它的菜谱来。不能是你想怎么写就怎么写。

还有,你用了别人的第三方类库,别人封装好了API,暴露给你什么,你就只能用什么(当然,你可以通过各种手段,比如反射,比如重写,重载),但是没必要,我们新人,不用搞那么多花里胡哨的。

我们最主要还是要好好学习。学习如何按照Rust的方式写Rust程序

分类: 编程语言 标签: rust 发布于: 2021-02-04 10:29:57, 点击数: