Rust 语言使用 SQLite 数据库

SQLite 是一种广泛使用的轻量级数据库,它通过简单的文件来承载数据,无需复杂的服务器配置。正因如此,它成为了许多桌面和移动应用的首选数据库。在 Rust 生态中,rusqlite 库为开发者提供了操作 SQLite 数据库的简洁且有效的方法。本文将全面介绍如何利用 rusqlite 在 Rust 中进行数据库操作。

起步安装

在开始之前,我们需要将 rusqlite 引入到你的 Rust 项目中。首先,在项目的 Cargo.toml 文件下的 [dependencies] 部分添加 rusqlite

[dependencies]
rusqlite = "0.25.3"

完成添加后,执行 cargo build 来下载和编译 rusqlite 库及其依赖。

打开和创建数据库

要操作一个 SQLite 数据库,首先需要创建一个连接。rusqlite 提供了 Connection 对象来实现这一点。以下示例展示如何打开一个存在的数据库文件或创建一个新的数据库文件:

use rusqlite::{Connection, Result};fn main() -> Result<()> {let conn = Connection::open("my_database.db")?;// 接下来,你可以使用 `conn` 来进行数据库操作// ...Ok(())
}

创建表

有了 Connection 对象,我们就可以开始创建数据表:

use rusqlite::{params, Connection, Result};fn main() -> Result<()> {let conn = Connection::open("my_database.db")?;conn.execute("CREATE TABLE if not exists person (id INTEGER PRIMARY KEY,name TEXT NOT NULL,age INTEGER)",params![],)?;Ok(())
}

在上述代码中,我们创建了一个简单的 person 表,包含 idnameage 三个字段。

插入数据

插入数据是数据库操作的基础。在 rusqlite 中,插入数据可以通过 execute 方法实现:

fn main() -> Result<()> {let conn = Connection::open("my_database.db")?;conn.execute("INSERT INTO person (name, age) VALUES (?1, ?2)",params!["Alice", 32],)?;Ok(())
}

查询数据

查询数据可以通过 query_map 方法来进行,它允许我们映射查询结果到 Rust 的结构体中:

use rusqlite::{params, Connection, Result, NO_PARAMS};#[derive(Debug)]
struct Person {id: i32,name: String,age: i32,
}fn main() -> Result<()> {let conn = Connection::open("my_database.db")?;let mut stmt = conn.prepare("SELECT id, name, age FROM person WHERE age > ?")?;let person_iter = stmt.query_map(params![20], |row| {Ok(Person {id: row.get(0)?,name: row.get(1)?,age: row.get(2)?,})})?;for person in person_iter {println!("Found person: {:?}", person?);}Ok(())
}

更新和删除数据

数据的更新和删除也是通过 execute 方法来完成的。下面展示如何对数据进行更新和删除:

fn main() -> Result<()> {let conn = Connection::open("my_database.db")?;// 更新数据conn.execute("UPDATE person SET age = ? WHERE id = ?",params![60, 1],)?;// 删除数据conn.execute("DELETE FROM person WHERE id = ?",params![1],)?;Ok(())
}

事务处理

使用 rusqlite 进行事务处理可以确保数据的一致性和完整性。transaction 方法可以用来包裹一系列数据库操作,确保它们要么全部成功,要么全部失败无效。下面的示例展示了如何使用事务:

use rusqlite::Connection;fn main() {let conn = Connection::open("my_database.db").unwrap();// 开启事务let tx = conn.transaction().unwrap();// 执行一系列数据库操作tx.execute("INSERT INTO person (name, age) VALUES (?1, ?2)", &["Bob", 45]).unwrap();tx.execute("UPDATE person SET age = age + 1 WHERE name = ?1", &["Alice"]).unwrap();// 如果所有操作都成功,提交事务tx.commit().unwrap();
}

结束语

rusqlite 是 Rust 中操作 SQLite 数据库的一个强大工具,它通过安全且符合 Rust 风格的接口,极大程度地简化了数据库的操作。应用 rusqlite,你可以专注于业务逻辑的构建,而不必担心底层 SQL 的繁琐。通过本文的介绍,我希望你能够对如何使用 rusqlite 有个清晰的认识,并能够在你自己的项目中愉快地使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用Redis高效实现12306的复杂售票业务

12306的售票业务是一个复杂的系统&#xff0c;需要考虑高并发、高可用、数据一致性等问题。使用Redis作为缓存和持久化存储&#xff0c;可以提高系统的性能和可扩展性&#xff0c;以下是一些可能的实现方式&#xff1a; 1 票源信息缓存&#xff1a;将票源信息&#xff08;如车次…

算法刷题记录2

4.图 4.1.被围绕的区域 思路&#xff1a;图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归&#xff0c;找与边界O联通的O&#xff0c;并标记为#&#xff08;代表已遍历&#xff09;&#xff0c;最后图中剩下的O就是&#xff1a;被X包围的O。图中所有…

SQC、SQA

QC 品质控制/质量控制&#xff08;QC即英文Quality Control的简称&#xff0c;中文意义是品质控制&#xff09;其在ISO8402&#xff1a;1994的定义是“为达到品质要求所采取的作业技术和活动”。有些推行ISO9000的组织会设置这样一个部门或岗位&#xff0c;负责ISO9000标准所要…

Spring Boot 中 Controller 接口参数注解全攻略与实战案例详解

引言 在 Spring Boot 应用程序中&#xff0c;Controller 是 MVC 架构模式中的核心组件之一&#xff0c;负责处理 HTTP 请求并返回响应结果。为了更好地映射请求、解析请求参数、执行业务逻辑和生成视图或 JSON 数据&#xff0c;Controller 中广泛使用了各种注解。本文将全面梳…

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言 对于一些单片机类的环境检测或者智能家居小项目中&#xff0c;温湿度传感器&#xff08;DHT11&#xff09;以及光照强度传感器&#xff08;BH1750&#xff09;往往是必不可少的两个外设&#xff0c;下面我们来剖析这两个外设的原理&#xff0c;以及使用。 1. 温湿度传感…

C语言中,__attribute__关键字

在C语言中&#xff0c;__attribute__是一种特殊的关键字&#xff0c;用于提供关于变量、函数或类型的附加信息。这些信息可以用于编译器优化、代码检查或其他目的。 以下是一些常见的C语言attribute及其用法&#xff1a; 1. __attribute__((const))&#xff1a;表示一个变量的…

Prometheus指标

文章目录 Prometheus指标主要参数解释一、可用性监测(0代表存在异常或未启动,1代表运行中)二、节点监测三、服务监测1.HDFS监测2.Yarn监测3.Hive监测4.Kafka监测5.Zookeeper监测Prometheus指标 主要参数解释 # 节点IP和端口(instance) 例如:192.168.1.226:9100、192.168.1.…

java篇-Springboot解决跨域问题的三种方式

第一种&#xff1a;添加CrossOrigin注解 在Controller层对应的方法上添加CrossOrigin或者类上添加CrossOrigin package com.example.controller;import com.example.model.Book; import com.example.service.InBookService; import org.springframework.beans.factory.anno…

软件工程的生命周期

软件工程的生命周期 1.市场调研用户的需求&#xff0c;并进行可行性分析&#xff08;从多个角度分析能否达到预期收益&#xff09;。 2.立项&#xff1a;确定项目组核心骨干成员&#xff0c;以及各阶段的里程碑。 3.需求调研&#xff1a;产品经理深度挖掘用户需求&#xff0c;将…

简明 Python 教程(第14章 Python的多线程)

Python多线程是指在Python程序中可以同时运行多个线程&#xff0c;每个线程可以执行不同的任务。Python提供了两个标准库来支持多线程&#xff1a;threading和_thread。通常&#xff0c;推荐使用threading模块&#xff0c;因为它提供了更高级别的API&#xff0c;更易于使用。 …

嵌入式4-18

做一个简单数据库终端操作系统 #include <myhead.h> int main(int argc, const char *argv[]) {int id;char name[16];float score;sqlite3 *pNULL;if(sqlite3_open("./my.db",&p)!SQLITE_OK){printf("sqlite3_open error\n");return -1;} …

python中中英文打印对齐解决方案

在python中&#xff0c;有时候会出现中英文混合输出的情形&#xff0c;但是由于中文默认是全角格式&#xff08;一个中文字符占用两个字符宽度&#xff09;&#xff0c;这会对python原生的print函数带来一些障碍。尤其是用户用print对齐输出的时候&#xff0c;这种差异会导致文…

顺序表链表经典算法题

1.链表反转 typedef struct ListNode listnode; struct ListNode* reverseList(struct ListNode* head) {if(head NULL){return head;}listnode* p1 NULL;listnode* p2 head;listnode* p3 head->next;while(p2){p2->next p1;p1 p2;p2 p3;if(p3)p3 p3->next;}…

ASP.NET MVC企业级程序设计 (商品管理:小计,总计,删除,排序)

目录 效果图 实现过程 1创建数据库 2创建项目文件 3创建控制器&#xff0c;右键添加&#xff0c;控制器 ​编辑 注意这里要写Home​编辑 创建成功 数据模型创建过程之前作品有具体过程​编辑 4创建DAL 5创建BLL 6创建视图&#xff0c;右键添加视图 ​编辑 7HomeCont…

ST-GCN模型详解(+openpose)

ST-GCN模型详解&#xff08;openpose&#xff09; 一、什么是ST-GCN呢 基于骨架的动作识别&#xff08;Skeleton-Based Action Recognition&#xff09;主要任务是从一系列时间连续的骨骼关键点&#xff08;2D/3D&#xff09;中识别出正在执行的动作。因为牵涉到骨骼框架这种…

draw.io使用心得

draw.io&#xff08;现在称为 “diagrams.net”&#xff09;是一个非常受欢迎的免费在线图表和流程图工具。以下是一些关于使用draw.io的心得体会&#xff1a; 易用性 直观的界面&#xff1a;draw.io提供了一个直观且用户友好的界面&#xff0c;使得即使是初学者也能快速上手…

无线电频段划分

业余无线电&#xff0c;被无线电爱好者们亲切地称为“空中的交响乐”&#xff0c;它不仅需要你的热情和技巧&#xff0c;更需要你对不同频段的特性有深入的了解。就像一位音乐家需要熟悉每一种乐器的声音&#xff0c;每一位无线电爱好者也需要掌握每一个频段的特点。注意&#…

智慧公厕解决方案易集成好使用的智能硬件

在现代城市建设中&#xff0c;智慧公厕的需求日益增长。为了提供更好的用户体验和更高效的管理&#xff0c;易集成、好使用的智能硬件成为智慧公厕解决方案的关键组成部分。 1. 蹲位有人无人感应器&#xff1a;是用于检测厕位有人无人的设备&#xff0c;根据现场不同的安装条件…

Flask前端页面文本框展示后端变量,路由函数内外两类

一、外&#xff01;路由函数外的前后端数据传输 Flask后端 ↓ 首先导入包&#xff0c;需要使用 后端&#xff1a;flask_socketio来进行路由外的数据传输&#xff0c; from flask_socketio import SocketIO, emit 前端&#xff1a;还有HTML头文件的设置。 <!DOCTYPE …

DevOps是什么?

DevOps是一系列实践、工具和文化理念的组合&#xff0c;旨在自动化并整合软件开发和信息技术运维团队之间的流程。以下是DevOps的几个关键点&#xff1a; 沟通与协作&#xff1a;DevOps强调开发和运维团队之间的沟通与合作&#xff0c;通过改善这两个部门间的协作关系&#xff…