Rust 连接 SQLite 数据库

使用 Rust 语言连接操作 SQLite 数据库,我使用 rusqlite 这个 crate。

看例子:

首先,使用 cargo 创建一个 Rust 项目,然后添加依赖 rusqlite:

8 
9 
dependencies] 
rusqtite = " 
o. 26.3

 

来到 main.rs,其余所有的代码都写在这里。

首先引入 rusqlite 相关的类型,并建立一个 Person struct:

@ main.rs U X 
src > @ main.rs > „ 
1 
2 
3 
4 
5 
6 
7 
8 
use rusqlite :: {params, 
Åderive(Debug)] 
struct Person { 
id: i32, 
name: String, 
Connection , 
Result}; 
data: Option<Vec<u8>>,

Person 有三个字段,id、name 和 data,其实本例中,我们只会用到前两个字段。

 

下面,编写一个用来创建数据库和 person 表的函数:

10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
fn 
create_db() Result<Connection> { 
let 
database file 
"data. db"; 
Connection :: ; 
let conn 
let 
conn.execute( "DROP TABLE person" , 
conn. execute( 
"CREATE TABLE person ( 
id 
name 
data 
a, 
Ok(conn) 
INTEGER PRIMARY KEY, 
TEXT NOT NULL, 
BLOB

该函数会创建名为 data.db 的数据库文件(如果不存在的话),然后打开一个数据库lian jie,并删除 person 表(如果存在的话),然后再建立一个 person 表,最后将 Connection 返回。

 

接下来,我们再创建一个 insert_data 函数,它用来插入两条数据,它使用 create_db 函数返回的 Connection 的引用作为参数:

fn insert_data(conn: &Connection) Result<()> { 
Person { 
let pl 
id: 
1, 
"Dave" .to_string(), 
name : 
data: None, 
Person { 
let p2 
id: 
2, 
"Nick" . 
name : 
data: None, 
conn . execute( 
"INSERT INTO person (id, name, data) 
VALUES (?1, ?3), 
params![pl.id, pl. name, pl. data, p2.id, 
p2 . name, 
p2.data],

 

再创建一个可以从数据库查询数据的函数 get_data,它会返回一个 Person 的 Vec:

fn get_data(conn: 8Connection) Result<Vec<Person>> { 
let 
let 
let 
for 
conn.prepare( "SELECT id, name, data from person")? ; 
mut stmt 
I rowl { 
stmt . [ ] , 
persons _ iterator - 
Ok(Person { 
id: row. get(ø)?, 
name: row.get(l)?, 
data: row.get(2)?, 
mut persons = Vec :: new(); 
p in persons _ iterator { 
persons . push(p?); 
Ok(persons)

 

最后,我们在 main 函数里依次调用这些函数,并把从数据库读取的数据进行打印:

fn main() { 
- create_db()?; 
let conn 
get_data(&conn)? 
let 
persons 
persons { 
for p 
in 
print In! ("Hi: , 
p);

 

运行结果:

(base) solenovex@yangxus—MacBook—Pro—15 sqlite % cargo run 
Compiling 
Finished 
Running 
Person { 
Person { 
sqlite v0.1.0 (/Users/s01enovex/Projects/sq1ite) 
dev [unoptimized + debuginfo] target(s) in 0.40s 
Hi: 
Hi: 
target/ debug/sqlite 
id: 1, name: "Dave" , 
id: 2, name: 
"Nick" , 
data: None } 
data: None }

 

posted @ 2022-01-21 21:24  yangxu-pro  阅读(2667)  评论(0编辑  收藏  举报