锋哥学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程序