如何使用 SQLite ?

news2024/11/19 15:37:18

SQLite 是一个轻量级、嵌入式的关系型数据库管理系统(RDBMS)。它是一种 C 库,实现了自给自足、无服务器、零配置、事务性 SQL 数据库引擎。SQLite 的源代码是开放的,完全在公共领域。它被广泛用于各种应用程序,包括浏览器、操作系统、移动应用等。

SQLite 的基本特性

  1. 轻量级:SQLite 的库文件非常小,通常只有几百KB。
  2. 自包含:SQLite 不依赖于外部的服务器进程,所有的数据都存储在一个单一的文件中。
  3. 零配置:无需安装和配置,数据库可以直接使用。
  4. 事务性:SQLite 支持原子性、可一致性、隔离性和持久性(ACID)的事务。
  5. 跨平台:SQLite 可以在 Windows、Linux、macOS、iOS 和 Android 等多个平台上运行。
  6. 高效:对于大多数单用户应用和嵌入式系统,SQLite 提供了足够的性能。

SQLite 安装和配置

使用 SQLite 不需要复杂的安装和配置步骤。大多数现代的编程语言和开发环境都内置了 SQLite 支持。以下是一些常见环境中如何安装和使用 SQLite 的方法:

在 Python 中使用 SQLite

Python 标准库中包含了 SQLite 的支持,可以通过 sqlite3 模块直接使用。

import sqlite3

# 创建数据库连接
conn = sqlite3.connect('example.db')

# 创建游标对象
cursor = conn.cursor()

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users
                  (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')

# 插入数据
cursor.execute('''INSERT INTO users (name, age) VALUES (?, ?)''', ('Alice', 25))
cursor.execute('''INSERT INTO users (name, age) VALUES (?, ?)''', ('Bob', 30))

# 提交事务
conn.commit()

# 查询数据
cursor.execute('''SELECT * FROM users''')
rows = cursor.fetchall()
for row in rows:
    print(row)

# 关闭连接
conn.close()
在命令行中使用 SQLite

SQLite 提供了一个命令行工具,可以直接操作 SQLite 数据库。以下是一些常见的命令:

# 启动 SQLite 命令行工具
$ sqlite3 example.db

# 创建表
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);

# 插入数据
sqlite> INSERT INTO users (name, age) VALUES ('Alice', 25);
sqlite> INSERT INTO users (name, age) VALUES ('Bob', 30);

# 查询数据
sqlite> SELECT * FROM users;
1|Alice|25
2|Bob|30

# 退出命令行工具
sqlite> .exit

SQLite 的基本操作

创建数据库和表

在 SQLite 中,创建一个新的数据库实际上是创建一个新的文件。可以通过 sqlite3 工具或程序代码来创建数据库和表。

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER NOT NULL
);
插入数据

可以使用 INSERT INTO 语句向表中插入数据。

INSERT INTO users (name, age) VALUES ('Charlie', 22);
查询数据

可以使用 SELECT 语句从表中查询数据。

SELECT * FROM users;
更新数据

可以使用 UPDATE 语句更新表中的数据。

UPDATE users SET age = 26 WHERE name = 'Alice';
删除数据

可以使用 DELETE 语句删除表中的数据。

DELETE FROM users WHERE name = 'Bob';
使用索引

索引可以加速数据库的查询速度。可以使用 CREATE INDEX 语句创建索引。

CREATE INDEX idx_name ON users (name);

高级功能

事务

事务是一组操作的集合,这些操作要么全部执行,要么全部不执行。SQLite 支持事务,并且默认在每个独立的 INSERTUPDATEDELETE 操作后自动提交事务。可以手动管理事务以提高性能。

BEGIN TRANSACTION;
INSERT INTO users (name, age) VALUES ('Dave', 28);
UPDATE users SET age = 29 WHERE name = 'Charlie';
COMMIT;
视图

视图是基于查询结果的虚拟表。可以使用 CREATE VIEW 语句创建视图。

CREATE VIEW user_names AS
SELECT name FROM users;
触发器

触发器是在某些表操作(如 INSERTUPDATEDELETE)发生时自动执行的一段代码。可以使用 CREATE TRIGGER 语句创建触发器。

CREATE TRIGGER user_age_check
BEFORE INSERT ON users
FOR EACH ROW
WHEN NEW.age < 0
BEGIN
    SELECT RAISE(FAIL, 'Age cannot be negative');
END;
外键约束

SQLite 支持外键约束,从而确保数据的完整性。可以在创建表时定义外键约束。

CREATE TABLE orders (
    id INTEGER PRIMARY KEY,
    user_id INTEGER,
    product TEXT,
    FOREIGN KEY (user_id) REFERENCES users (id)
);

性能优化

使用事务

将多个操作放在一个事务中可以显著提高性能。默认情况下,每个 INSERTUPDATEDELETE 操作后 SQLite 都会自动提交事务,这会导致大量的磁盘写入操作。可以通过手动管理事务来减少这种开销。

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 开始事务
conn.execute('BEGIN TRANSACTION')

for i in range(1000):
    cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('User'+str(i), 20+i))

# 提交事务
conn.commit()
conn.close()
使用适当的数据类型

尽量使用合适的数据类型来存储数据,可以减少存储空间并提高查询性能。例如,使用 INTEGER 来存储数字,而不是使用 TEXT

创建索引

为常用的查询字段创建索引,可以显著提高查询速度。但是,索引也会增加插入和更新操作的开销,因此应根据实际情况平衡利弊。

SQLite 的常见应用场景

嵌入式系统

由于其轻量级和自包含的特性,SQLite 非常适合嵌入式系统和设备。例如,在智能手机、电视和车载系统中,SQLite 经常被用作本地数据存储解决方案。

单用户应用程序

对于单用户应用程序,如桌面软件或移动应用,SQLite 是一个理想的选择。它不需要服务器进程,部署简单,并且提供足够的性能和功能。

测试和开发

在开发和测试阶段,SQLite 可以用作快速原型设计和测试的小型数据库。由于其零配置特性,开发者可以轻松地创建和管理数据库。

分布式数据库系统的缓存或中转存储

在一些分布式数据库系统中,SQLite 可以用作缓存层或中转存储,从而减少对主数据库的压力,并提高系统的整体性能。

SQLite 的限制

尽管 SQLite 具有许多优点,但在某些场景中也存在一些限制:

  1. 并发访问:SQLite 对并发写入操作支持有限,适合单用户或低并发场景。
  2. 存储容量:SQLite 的单个数据库文件最大为 140TB,但实际应用中,由于性能和管理上的考虑,适合较小的数据集。
  3. 功能:虽然 SQLite 支持大多数标准 SQL 功能,但不支持某些高级特性,如存储过程、用户定义函数(UDF)和某些类型的复杂查询。

SQLite 是一个强大且灵活的嵌入式数据库解决方案,适用于多种应用场景。从基本的数据库操作到高级功能,如事务、视图和触发器,SQLite 提供了一个完整的 SQL 数据库引擎,并且易于使用和集成。尽管存在一些限制,但对于大多数嵌入式和单用户应用来说,SQLite 是一个理想的选择。

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

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

相关文章

Python | ValueError: could not convert string to float: ‘example’

Python | ValueError: could not convert string to float: ‘example’ 在Python编程中&#xff0c;类型转换是一个常见的操作。然而&#xff0c;当尝试将一个字符串转换为浮点数时&#xff0c;如果字符串的内容不是有效的浮点数表示&#xff0c;就会遇到“ValueError: could…

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键&#xff0c;保持顺序ordered_keys []# 遍历data中的每个字典&#xff0c;添加其键到ordered_keys&#xff0c;如果该键还未被添加for d in original_list:for …

SpringCloud之@FeignClient()注解的使用方式

FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构&#xff0c;难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法&#xff0c;FeignClient()注解就是为了解决这个问题的…

Vim 文本编辑工具

Vim 基础命令 一、Vim 命令速查 Vim 是一款功能强大的文本编辑器&#xff0c;广泛应用于Linux系统中。以下是一些基础但非常有用的Vim命令&#xff0c;它们将帮助你更高效地使用Vim。 使用单个字母键通常需要进一步的输入以形成完整命令。特殊符号用来表示操作的位置。 命令…

Linux网络:传输层TCP协议(四)拥塞控制及延迟应答

目录 一、拥塞控制 二、延迟应答 一、拥塞控制 虽然 TCP 拥有滑动窗口这个大杀器机制来根据具体情况对发送的数据大小和速度进行实时控制, 能够高效并且可靠的发送大量的数据. 但是如果在双方建立好连接后的刚开始阶段就发送大量的数据。仍然可能引发一些问题. 因为同一个网…

【2024蓝桥杯/C++/A组/团建】

题目 代码 #include<bits/stdc.h> using namespace std;const int N 2e510;int a[N], b[N]; int ans; vector<int> Ga[N], Gb[N];void dfs(int ap, int af, int bp, int bf, int dep) {ans max(ans, dep);map<int, int> bk;for(auto ason : Ga[ap])if(aso…

免费【2024】springboot 程序设计基础视频学习系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

CSS:mix-blend-mode属性(设置元素的混合模式)

目录 一、mix-blend-mode属性介绍 二、mix-blend-mode常用属性值 三、mix-blend-mode属性应用 四、文字智能适配背景 1、原始样式 2、添加混合 3、实现代码 一、mix-blend-mode属性介绍 CSS中的【mix-blend-mode属性】描述了元素的内容应该与元素的直系父元素的内容和…

nodejs安装及环境配置轨道交通运维检测系统App-OA人事办公排班故障维修

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

【前端 09】JavaScript中的对象与JSON

JavaScript中的对象与JSON 在JavaScript中&#xff0c;对象和JSON&#xff08;JavaScript Object Notation&#xff09;是两个紧密相连但又有区别的概念。它们都在数据处理和交换中扮演着重要角色。本文将详细讲解JavaScript中的自定义对象以及JSON对象的基本概念、格式、用法…

赵本山:我跟你找游大队去,王平:实话告诉你,我就是游队长——小品《卖梨》(下)的台词与解说

赵本山&#xff1a;我跟你找游大队去&#xff0c;王平&#xff1a;实话告诉你&#xff0c;我就是游队长 ——小品《卖梨》&#xff08;下&#xff09;的台词与解说 &#xff08;接上&#xff09; 王平&#xff08;饰演警察&#xff09;&#xff1a;你少废话 你赶紧给我挪地方…

视觉SLAM第二讲

SLAM分为定位和建图两个问题。 定位问题 定位问题是通过传感器观测数据直接或间接求解位置和姿态。 通常可以分为两类&#xff1a;基于已知地图的定位和基于未知地图的定位。 基于已知地图的定位 利用预先构建的地图&#xff0c;结合传感器数据进行全局定位。SLAM中的全局…

USB 2.0 协议专栏之 USB 2.0 连接与枚举(二)

前言&#xff1a;本篇博客为手把手教学的 USB 2.0 协议栈类精品博客&#xff0c;该专栏博客侧重针对 USB 2.0 协议进行讲解。本篇博客将针对 USB 2.0 中的连接与枚举进行教学&#xff0c;USB 的枚举过程是 USB 协议中至关重要的一环&#xff0c;也是嵌入式工程师必须掌握的内容…

杂谈(杂鱼谈论c语言)——2.大小端字节序

⼤⼩端字节序和字节序判断 当我们了解了整数在内存中存储后&#xff0c;我们调试看⼀个细节&#xff1a; #include <stdio.h> int main() {int a 0x11223344;return 0; } 调试的时候&#xff0c;我们可以看到在a中的 0x11223344 这个数字是按照字节为单位&#xff0c;…

【多模态大模型】 ALBEF in NeurIPS 2021

一、引言 论文&#xff1a; Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 作者&#xff1a; Salesforce Research 代码&#xff1a; ALBEF 特点&#xff1a; 该方法使用ViT进行图像特征提取&#xff0c;提出将BERT分两部分&am…

解密阿里大神写的天书般的Tree工具类,轻松搞定树结构!

首发公众号&#xff1a;赵侠客 一、引言 最近公司新进了不少新人&#xff0c;包括一些来自阿里、网易等大型企业的资深工程师。我们组的一位新同事是阿里来的专家&#xff0c;我在CR&#xff08;Code Review, 简称CR&#xff09;时看到了他编写的一个关于树操作的工具类&#…

用qt调试can通信,波特率如何设置

硬件环境介绍&#xff1a; 1、usb转can通信模块型号为创芯科技的USB-CAN适配器&#xff0c;厂家提供的测试软件和demo程序&#xff0c;如下图所示&#xff1b; 2、下位单片机STM32&#xff0c;can通信参数如下图&#xff0c;该测试程序时单片机一直在发送数据&#xff1b; 测试…

STM32F103 RT-thread配置LCD的FMC

使用的正点原子F103ZET6开发板&#xff0c;屏幕是一块4.3寸的TFTLCD&#xff0c;接下来直接讲配置流程 参考文章&#xff1a;基于正点原子F103精英板和CubeIDE的Hal库LCD驱动移植&#xff08;从零开始&#xff09;_正点原子 cubeide-CSDN博客 1&#xff0c;使用RT_Thread Stu…

最新版Bertom降噪,压缩,均衡,简单好用有效,win和mac,支持Intel和M芯片

一。Denoiser Classic 3.07 win&mac 1&#xff09; Denoiser Classic是一个零延迟降噪插件&#xff0c;用于音乐&#xff0c;后期制作和现场使用。 2&#xff09;产品特点&#xff1a; Bertom Denoiser是一个专为音乐和后期制作/对话设计的降噪插件。 一个简单的用户界面&…