rust语言学习笔记——Turso库(读写SQLite的库)

发布时间:2026/7/4 7:19:17

rust语言学习笔记——Turso库(读写SQLite的库) Turso简介SQLite的下一步发展一款专为Rust语言设计的、具有高性能且与SQLite兼容的数据库。一、Turso特点兼容SQLite其接口与rusqlite类似拥有熟悉的API不同之处在于它使用的是异步Rust语言。Sqlite同时只能一个写操作Turso可以并发写操作。高性能采用Rust语言开发以实现极致的速度与效率支持异步/等待机制具备tokio支持的原生异步操作功能处理中无需网络开销可直接在应用程序中运行。跨平台支持Linux、macOS和Windows系统事务支持具备回滚功能的全ACID事务支持预处理语句通过参数绑定实现高效的查询执行云同步通过Builder::new_remote()与Turso Cloud实现同步可选的sync功能二、安装将其添加到你的Cargo.toml中[dependencies] turso 0.6.1 tokio { version 1.52, features [full] }三、内存数据库案例useturso::Builder;#[tokio::main]asyncfnmain()-turso::Result(){// 创建一个内存数据库数据库连接letdbBuilder::new_local(:memory:).build().await?;letconndb.connect()?;// 连接数据库// 创建一个表conn.execute(CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT),(),).await?;// 插入数据到表conn.execute(INSERT INTO users (name, email) VALUES (?1, ?2),[Alice,aliceexample.com],).await?;conn.execute(INSERT INTO users (name, email) VALUES (?1, ?2),[Bob,bobexample.com],).await?;// 查询表中的数据letmutrowsconn.query(SELECT * FROM users,()).await?;whileletSome(row)rows.next().await?{letidrow.get_value(0)?;letnamerow.get_value(1)?;letemailrow.get_value(2)?;println!(用户id: {}用户名{}邮箱{},id.as_integer().unwrap_or(0),name.as_text().unwrap_or(.to_string()),email.as_text().unwrap_or(.to_string()));}Ok(())}四、文件的数据库案例useturso::{Builder,params};#[tokio::main]asyncfnmain()-turso::Result(){// new_local 按照路径构建一个基本的数据库参数对象build 根据数据库参数对象创建数据库并打开connect 连接数据库letdbBuilder::new_local(my-database.db).build().await?;letconndb.connect()?;// 创建一个表conn.execute(r#CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, f_test REAL, --浮点数据 b_test BLOB, --二进制数据 created_at DATETIME DEFAULT CURRENT_TIMESTAMP )#,(),).await?;letf_test16.55555555225;letb_testhello world.as_bytes().to_vec();// 插入一条数据, 并返回影响的行数letrows_affectedconn.execute(INSERT INTO posts (title, content, f_test, b_test) VALUES (?1, ?2, ?3, ?4),params![我的第一个帖子,这是我的第一个帖子,f_test,b_test],).await?;println!(插入 {} 行数据,rows_affected);println!(-----------------);// 查询所有数据, 并返回查询结果letmutrowsconn.query(SELECT * FROM posts,()).await?;// 遍历查询结果, 并打印每个字段的值whileletSome(row)rows.next().await?{println!(帖子id: {},row.get_value(0)?.as_integer().unwrap_or(0));println!(标题: {},row.get_value(1)?.as_text().unwrap_or(.to_string()));println!(内容: {},row.get_value(2)?.as_text().unwrap_or(.to_string()));println!(浮点数据: {},row.get_value(3)?.as_real().unwrap_or(0.0));println!(二进制数据: {:?},row.get_value(4)?.as_blob().unwrap_or(Vec::new()));println!(发帖时间: {:?},row.get_value(5)?.as_text().unwrap_or(.to_string()));println!(-----------------);}Ok(())}五、创建新数据库letdbBuilder::new_local(:memory:).build().await?;// 内存数据库letdbBuilder::new_local(data.db).build().await?;// 本地数据库六、执行SQL语句// 直接执行SQLletrows_affectedconn.execute(INSERT INTO users (name) VALUES (?1),[Alice]).await?;// 多行查询letmutrowsconn.query(SELECT * FROM users WHERE age ?1,[18]).await?;// sql预编译然后执行预编译查询letmutstmtconn.prepare(SELECT * FROM users WHERE id ?1).await?;// 执行预编译查询letmutrowsstmt.query([42]).await?;// 执行预编译语句letrows_affectedstmt.execute([Alice]).await?;七、插入的数据[aaa,bbb]只能是同一种数据类型params![aaa, 22, 2.2]可以不同的数据类型八、数据集相关操作rowsrows.next() - ResultOptionRow获取下一行数据rows.column_count() - usize获取字段数量rows.column_name(idx: usize) - ResultString根据索引获取字段名rows.column_names() - VecString获取所有字段名rows.column_index(name: str) - Resultusize根据字段名获取结果的索引rows.columns() - VecColumn获取查询结果的字段名类型Column{name: String, decl_type: OptionString}九、数据行相关操作rowrow.get_value(index: usize) - ResultValue根据索引获取值let title row.get_value(1)?.as_text().unwrap_or(.to_string())获取字段值转换为相应类型空值设置为空字符串row.getT(idx: usize) - ResultT根据索引获取查询结果的字段值let title row.get::String(1)?根据类型获取字段值row.column_count() - usize获取字段数量十、值相关操作Value1、Value的定义pubenumValue{Null,// 空值Integer(i64),// 整型Real(f64),// 浮点型Text(String),// 字符串Blob(Vecu8),// 二进制}2、Value值的判断Value.is_null() - bool值是否为空Value.is_integer(self) - bool值是否为i64Value.is_real(self) - bool值是否为f64Value.is_text(self) - bool值是否为StringValue.is_blob(self) - bool值是否为Vecu83、Value值的转换Value.as_integer() - Optioni64Value.as_real() - Optionf64Value.as_text() - OptionStringValue.as_blob() - OptionVecu84、空值处理.unwrap_or(0)整型.unwrap_or(0.0)浮点型.unwrap_or(.to_string())字符串.unwrap_or(Vec::new())二进制

相关新闻