【sql】sqlite3数据库

news2025/3/11 6:32:14

一、介绍

SQLite是一个轻量级的、开源的嵌入式数据库,由D. Richard Hipp使用C语言编写。由于其资源占用少、性能良好和零管理成本的特点,SQLite在嵌入式系统中得到了广泛应用,如Android和iPhone等操作系统中都有内置的SQLite数据库供开发人员使用。这种易用性加速了应用程序的开发,并使复杂的数据存储变得简单。

创建新用户的概念在 SQLite3 中并不适用,因为 SQLite3 不像其他数据库系统(如 PostgreSQL 或 MySQL)那样拥有用户管理的功能。在 SQLite 中,数据库以文件的形式存在,通常具有`.db`、`.sqlite`或`.sqlite3`作为文件扩展名,任何了解文件路径或能够连接到服务器上该文件的人都可以访问数据库,因此,访问控制是通过文件系统权限而非数据库内部控制实现的。

SQLite支持大部分标准SQL92和ACID特性,这意味着它提供了数据的一致性、原子性、隔离性和持久性保证。尽管SQLite没有用户管理和用户权限等高级功能,但它将整个数据库存储在一个文件中,这使得数据备份和传输变得简单。此外,SQLite的架构是可移植的,它由一个模块化的设计构成,包括8个独立的模块,用于处理SQL语句解析、执行、事务管理等任务。

在编程中,SQLite提供了API供多种编程语言使用,如PHP、Python和Perl等。此外,许多大型公共软件如Skype、Firefox、Gears和McAfee也使用了SQLite作为其数据库引擎。

尽管SQLite在许多应用中表现出色,但它可能不适合需要高并发写入操作或复杂数据管理的场景。在这些情况下,可能需要考虑使用更强大的数据库系统。

二、sqlite3命令

SQLite3 是一个命令行工具,用于与 SQLite 数据库进行交互。以下是一些常用的 SQLite3 命令:

进入 SQLite3 数据库

sqlite3 database_name.db
这会将您带入一个名为 sqlite> 的命令提示符,可以在其中输入 SQL 命令。

显示数据库信息

.databases

列出所有附加的数据库

显示数据库中的表

.tables

显示表结构

.schema [table_name]

显示指定表的创建语句。如果不指定表名,则显示所有表的创建语句。

退出数据库

.exit或.quit或者使用快捷键 Ctrl + D(在某些系统上是 Ctrl + C 或 Ctrl + Z)。

设置 SELECT 语句输出结果显示格式

.mode format
其中,format 可以是 csv, column, html, insert, line, list, tabs, tcl 等。

设置 SELECT 语句输出結果列间分隔符

.separator string

将結果输出到控制台

.output stdout

将結果输出到文件

.output [stdout|filename]

将输出结果保存到控制台或指定的文件。

设置 SELECT 语句输入結果空值默认显示字符

.nullvalue string

执行批处理 SQL 文件

.batch filename

打开一个新的内存数据库

.open :memory:

执行数据完整性检查

.check GLOB | REGEXP | LIKE

复制内存数据库

.clone :memory: :memory:

以文本形式导出数据库

.dump

显示当前配置参数

.show

显示当前的 SQLite 配置参数。

使用 shell 运行操作系统命令

.shell cmd args...

重新建立所有索引

.reindex

设置是否考虑空值进行比较

.allnulls on|off

设置数据库配置参数

.dbconfig config

加载扩展

.load filename sym

设置 NULL 值的表示文本

.nullvalue text

读取并执行 SQL 命令文件

.read filename

设置命令运行的超时时间

.timeout ms

执行跟踪命令

.trace cmd

显示或配置虚拟文件系统

.vfsinfo ?DATABASE?

修复损坏的数据库

.recover

显示可用的虚拟文件系统

.vfslist ?PATTERN?

显示当前的虚拟文件系统名称

.vfsname ?AUX?

注册自定义的虚拟文件系统

.vfsregister NAME SCRIPT

显示所有可用的命令和它们的简短描述

.help

执行语法检查

.lint cmd
对输入的 SQL 命令 cmd 进行语法检查。

显示最后插入的行 ID

.last_insert_rowid
显示最近一次 INSERT 操作生成的行 ID。

 开启或关闭表的头部显示

.headers [on|off]

此外,SQLite3 还支持标准的 SQL 命令,如 SELECT、INSERT、UPDATE、DELETE、CREATE TABLE、DROP TABLE 等。

三、外键

SQLite3中的外键是一种约束,它用于自动维护表之间的数据完整性。外键(Foreign Key)约束是用来链接两个表的。在一个表中的外键指向另一个表的主键(Primary Key)。这样的关系帮助确保参照的完整性,确保不能添加没有对应另一表中主键的外键值,也不能删除或修改另一表中被其它记录所参照的那些值。
SQLite默认是不启用外键约束的,即使在创建表时定义了外键,SQLite也不会去强制执行它,除非显式地启用外键支持。
要启用SQLite的外键支持,可以在每次打开数据库连接后执行如下SQL命令:
PRAGMA foreign_keys = ON;
要关闭外键支持,可以使用:
PRAGMA foreign_keys = OFF;
为了查看SQLite数据库的外键是否被打开,可以执行以下SQL命令:
PRAGMA foreign_keys;
这个命令会返回一个结果,如果外键约束已经启用,则结果为1;如果没有启用,则结果为0。这个设置是针对当前的数据库连接的,也就是说每次连接数据库的时候都需要检查并设定它,它不是一个持久化的设置。

四、python中使用 SQLite3

Python 标准库自带了 SQLite3 支持,因此不需要额外安装。

连接到 SQLite 数据库

使用 sqlite3.connect() 函数连接到 SQLite 数据库。如果数据库文件不存在,它将被创建。

import sqlite3  
  
# 连接到数据库(如果不存在,则创建)  
conn = sqlite3.connect('example.db')  
  
# 创建一个游标对象  
cursor = conn.cursor()

执行 SQL 语句

使用游标对象执行 SQL 语句。

# 创建一个表  
cursor.execute('''  
CREATE TABLE IF NOT EXISTS users (  
    id INTEGER PRIMARY KEY,  
    name TEXT NOT NULL,  
    age INTEGER  
)  
''')  
  
# 插入数据  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 30))  
  
# 提交更改  
conn.commit()

查询数据

# 查询所有数据  
cursor.execute("SELECT * FROM users")  
rows = cursor.fetchall()  
for row in rows:  
    print(row)  
  
# 查询特定数据  
cursor.execute("SELECT * FROM users WHERE name=?", ("Alice",))  
alice_data = cursor.fetchone()  
print(alice_data)

关闭连接

完成所有操作后,确保关闭数据库连接。

# 关闭游标和连接  
cursor.close()  
conn.close()

SQLite3 的其他功能

SQLite3 还支持许多其他功能,如事务、索引、视图、触发器等。可以查阅 SQLite 官方文档以获取更多信息。

尽管 SQLite 是一个轻量级的数据库,但它仍然具有完整的 SQL 支持,并且非常适合需要小型、快速和可靠的数据库解决方案的项目。

五、附加数据库

在 SQLite3 中,附加数据库(ATTACH DATABASE)是指将一个数据库文件(通常是一个 .db 文件)连接到当前的数据库连接中,以便在同一个连接中能够访问多个数据库。这通常用于在单个 SQLite 会话中操作多个数据库文件。

以下是附加数据库的步骤:

打开 SQLite3 命令行界面:

首先,需要打开 SQLite3 的命令行界面。这可以通过在终端或命令提示符中输入 sqlite3 命令来实现。

sqlite3

如果想要附加的数据库已经存在,可以直接附加它。否则,可能需要先创建一个数据库。

创建或打开一个数据库(如果需要):

如果需要附加的数据库还不存在,可以使用以下命令创建一个新的数据库文件:

sqlite> CREATE DATABASE newdatabase.db;

或者,可以打开一个已经存在的数据库文件:

sqlite3 existingdatabase.db

附加数据库:

一旦打开了 SQLite3 命令行界面并且有一个数据库连接,可以使用 ATTACH 命令来附加另一个数据库文件。以下是 ATTACH 命令的基本语法:

sqlite> ATTACH DATABASE 'path_to_database.db' AS 'alias_name';

其中,'path_to_database.db' 是要附加的数据库文件的路径,而 'alias_name' 是为这个附加数据库指定的别名。这个别名将在随后的 SQLite 命令中用来引用这个附加的数据库。

例如:

sqlite> ATTACH DATABASE '/path/to/mydatabase.db' AS 'mydbalias';

验证附加的数据库:

可以使用 .databases 命令来查看所有当前附加的数据库,包括主数据库和任何附加的数据库。

sqlite> .databases

这将显示一个列表,其中包含每个数据库的名称和别名(如果有的话)。

使用附加的数据库:

一旦数据库被附加,可以通过在其前面加上别名来引用它,并执行 SQL 命令。例如:

sqlite> PRAGMA mydbalias.table_info(mytable);

在这个例子中,mydbalias 是附加数据库的别名,而 mytable 是该数据库中的一个表。

分离数据库(如果需要):

如果想要从当前连接中分离一个附加的数据库,可以使用 DETACH DATABASE 命令。

sqlite> DETACH DATABASE 'alias_name';

这将断开与指定别名的数据库的连接,但不会删除数据库文件本身。

六、SQL电商网站数据库设计案例

在设计电商网站数据库之前,我们需要对电商网站的业务需求进行分析。常见的业务需求包括商品管理、用户管理、订单管理、购物车管理等。根据这些需求,我们可以抽象出以下实体和关系:

用户(User):包含用户ID、用户名、密码、邮箱、手机号等属性。
商品(Product):包含商品ID、商品名称、商品描述、价格、库存等属性。
订单(Order):包含订单ID、用户ID、商品ID、购买数量、订单状态等属性。
购物车(Cart):包含购物车ID、用户ID、商品ID、商品数量等属性。
实体之间的关系如下:

一个用户可以拥有多个订单和购物车。
一个订单对应一个用户和一个商品。
一个购物车对应一个用户和一个商品。
基于上述需求分析,我们可以使用SQL语句创建相应的数据库表。以下是一个简化的电商网站数据库设计示例:

-- 创建用户表  
CREATE TABLE User (  
  user_id INT PRIMARY KEY AUTO_INCREMENT,  
  username VARCHAR(50) NOT NULL,  
  password VARCHAR(50) NOT NULL,  
  email VARCHAR(100),  
  phone VARCHAR(20)  
);  
  
-- 创建商品表  
CREATE TABLE Product (  
  product_id INT PRIMARY KEY AUTO_INCREMENT,  
  product_name VARCHAR(100) NOT NULL,  
  description TEXT,  
  price DECIMAL(10, 2) NOT NULL,  
  stock INT NOT NULL  
);  
  
-- 创建订单表  
CREATE TABLE Order (  
  order_id INT PRIMARY KEY AUTO_INCREMENT,  
  user_id INT,  
  product_id INT,  
  quantity INT NOT NULL,  
  status VARCHAR(20) NOT NULL,  
  FOREIGN KEY (user_id) REFERENCES User(user_id),  
  FOREIGN KEY (product_id) REFERENCES Product(product_id)  
);  
  
-- 创建购物车表  
CREATE TABLE Cart (  
  cart_id INT PRIMARY KEY AUTO_INCREMENT,  
  user_id INT,  
  product_id INT,  
  quantity INT NOT NULL,  
  FOREIGN KEY (user_id) REFERENCES User(user_id),  
  FOREIGN KEY (product_id) REFERENCES Product(product_id)  
);

上述SQL语句创建了四个表:User、Product、Order和Cart,并定义了它们之间的外键关系。在实际应用中,可能还需要添加其他字段和索引来满足特定的业务需求。

为了在SQLite上运行这个案例,需要对SQL语句进行一些调整以确保它们与SQLite的语法兼容。以下是根据SQLite语法调整的SQL语句:

-- 创建用户表  
CREATE TABLE User (  
  user_id INTEGER PRIMARY KEY AUTOINCREMENT,  
  username TEXT NOT NULL,  
  password TEXT NOT NULL,  
  email TEXT,  
  phone TEXT  
);  
  
-- 创建商品表  
CREATE TABLE Product (  
  product_id INTEGER PRIMARY KEY AUTOINCREMENT,  
  product_name TEXT NOT NULL,  
  description TEXT,  
  price REAL NOT NULL,  
  stock INTEGER NOT NULL  
);  
  
-- 创建订单表  
CREATE TABLE "Order" (  
  order_id INTEGER PRIMARY KEY AUTOINCREMENT,  
  user_id INTEGER,  
  product_id INTEGER,  
  quantity INTEGER NOT NULL,  
  status TEXT NOT NULL,  
  FOREIGN KEY (user_id) REFERENCES User(user_id),  
  FOREIGN KEY (product_id) REFERENCES Product(product_id)  
);  
  
-- 创建购物车表  
CREATE TABLE Cart (  
  cart_id INTEGER PRIMARY KEY AUTOINCREMENT,  
  user_id INTEGER,  
  product_id INTEGER,  
  quantity INTEGER NOT NULL,  
  FOREIGN KEY (user_id) REFERENCES User(user_id),  
  FOREIGN KEY (product_id) REFERENCES Product(product_id)  
);  
  
-- 启用外键支持(在SQLite中默认是关闭的)  
PRAGMA foreign_keys = ON;

注意以下几点:

  1. AUTO_INCREMENT更改为AUTOINCREMENT,这是SQLite的自增关键字。
  2. VARCHAR类型更改为TEXT,因为SQLite没有VARCHAR类型,它使用TEXT来存储字符串。
  3. DECIMAL类型更改为REAL,因为SQLite没有DECIMAL类型,它使用REAL来存储浮点数。
  4. 由于Order是SQLite的保留字,所以将订单表名称用双引号括起来,但更好的做法是使用一个不是保留字的表名,比如Orders

可以将这些SQL语句保存在一个文件中,比如命名为database_schema.sql,然后在SQLite命令行工具中运行这个文件来创建数据库架构。要运行这个文件,可以使用以下命令:

sqlite3 your_database_name.db < database_schema.sql

这里your_database_name.db是想要创建的数据库文件名,而database_schema.sql是包含上述SQL语句的文件名。这条命令会创建一个新的SQLite数据库(如果它不存在的话),并执行SQL文件中的语句来设置数据库架构。

本案例介绍了如何使用SQL设计一个电商网站的数据库。通过需求分析,我们抽象出了用户、商品、订单和购物车等实体,并定义了它们之间的关系。然后,我们使用SQL语句创建了相应的数据库表,并定义了主键和外键约束。

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

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

相关文章

华为智慧屏推出多种功能,春节期间全家一起玩乐 /腾讯广告妙思:一站式AI广告创意平台|魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 华为智慧屏推出多种功能&#xff0c;春节期间全家一起玩乐 腾讯广告妙思&am…

表的操作【mysql数据库】

目录 一、创建表 二、查看表 三、修改表 改表名&#xff1a; 新增一列&#xff1a; 修改某列的属性&#xff1a; 删除某列&#xff1a; 改列名 四、删除表 一、创建表 二、查看表 desc&#xff1a;查看表的详细信息 查看建表时的详细信息&#xff1a; 三、修改表 改表…

win10下wsl2使用记录(系统迁移到D盘、配置国内源、安装conda环境、配置pip源、安装pytorch-gpu环境、安装paddle-gpu环境)

wsl2 安装好后环境测试效果如下&#xff0c;支持命令nvidia-smi&#xff0c;不支持命令nvcc&#xff0c;usr/local目录下没有cuda文件夹。 系统迁移到非C盘 wsl安装的系统默认在c盘&#xff0c;为节省c盘空间进行迁移。 1、输出wsl -l 查看要迁移的系统名称 2、执行导出命…

C#,二进制数的按位旋转(Bits Rotate)算法与源代码

1 二进制数的按位旋转 二进制数的按位旋转&#xff08;翻转&#xff09;是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大&#xff0c;右转意味着数据变小&#xff08;有损&#xff09;。 2 源程序 using System; using System.Text; us…

武汉灰京文化浅谈手游崛起的新游戏时代

随着智能手机性能的不断提升&#xff0c;手游正逐渐迈向与主机和PC游戏相媲美的领域。高性能处理器、强大的图形处理能力以及智能化技术的融合&#xff0c;使得手游可以实现更高画质和更流畅的操作体验。而虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xf…

【前端工程化面试题】webpack proxy的工作原理,为什么能解决跨域问题

在 webpack 的配置文件 webpack.config.js 中有一个配置项 devServer 里面有一个属性是 proxy&#xff0c;这里面可以配置代理服务器&#xff0c;解决跨域问题&#xff0c;请参考官网。 一般来说 webpack 的代理就是说的开发服务器 webpack-dev-server。 其实不光是 webpack 其…

Eclipse 创建 Hello World 工程

Eclipse 创建 Hello World 工程 1. Hello WorldReferences Download and install the Eclipse IDE. 1. Hello World Eclipse -> double click -> Launch 单击蓝色方框 (右上角) 最大化 IDE File -> New -> C Project -> Finish Project name&#xff1a;工程名…

python学习(三):pip安装及如何加速安装第三方组件

pip全称Package Installer for Python&#xff0c;即用来安装第三方组件的工具 一.安装pip Python3中setuptools、Pip安装详解 1、安装setuptools 命令如下&#xff1a; wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.…

利用 ETX 混合云虚拟桌面基础架构 (VDI)随时随地工作

混合工作已经成为新常态。企业正在重新思考如何交付 IT 服务&#xff0c;以便为现场和远程员工提供最佳服务。为了实现现代化和提高效率&#xff0c;企业正在实施可以托管在数据中心或云中的应用程序虚拟化基础架构模型&#xff0c;以提供高性能的虚拟桌面和应用程序。 OpenTe…

[SWPUCTF 2021 新生赛]crypto8

第一眼看见是乱码不确定是什么的编码 看了下感觉是UUencode编码 UUencode编码是一种古老的编码方式&#xff0c;通常用于将二进制数据转换成可打印字符的形式。UUencode编码采用一种基于64个字符的编码表&#xff0c;将每3个字节的数据编码为4个可打印字符&#xff0c;以实现…

深入浅出了解谷歌「Gemini大模型」发展历程

Google在2023年12月官宣了Gemini模型&#xff0c;随后2024年2月9日才宣布Gemini 1.0 Ultra正式对公众服务&#xff0c;并且开始收费。现在2024年2月14日就宣布了Gemini 1.5 Pro&#xff0c;史诗级多模态最强MoE首破100万极限上下文纪录&#xff01;&#xff01;&#xff01;Gem…

AI怎么写作?如何利用AI写作?AI写作方式一定要学会

懂得怎么样向ChatGPT提问&#xff0c;会更有效率地得到更符合用户需求的答案。 也就是要懂得怎么写prompt。 今天我们尝试用一个写故事小说的案例来实践一下~ 在正式开始之前&#xff0c;我们先来看看以下内容。 问&#xff1a;发挥你的想象&#xff0c;帮我写⼀篇帅⽓霸道总…

【深度优先搜索】【图论】【树】2646. 最小化旅行的价格总和

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 涉及知识点 深度优先搜索 图论 树 LeetCode2646. 最小化旅行的价格总和 现有一棵无向、无根的树&#xff0c;树中有 n 个节点&#xff0c;按从 0 到 n - 1 编号。给你一个整数 n 和一个长…

实例观察 c 语言中 volatile 的作用

volatile 意思是易变的。 在 c 语言中&#xff0c;如果变量被 volatile 修饰&#xff0c;就是告诉编译器这个变量随时都可能发生变化&#xff0c;那么每次读取变量的时候都会到内存中读取。 如果变量没有被 volatile 修饰&#xff0c;并且编译器发现在多次读取变量之间&#…

一文搞懂设计模式—观察者模式

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 使用场景实现方式Java对观察者模式的支持Guava对观察者模式的支持Spring对观察者模式的支持 优缺点 观察者模式&#xff08;Observer Pattern&#xff09;是一种…

FlashMeeting(基于FFmpeg+openCV)视频语音通讯系统

Web端体验地址&#xff1a;https://download.csdn.net/download/XiBuQiuChong/88805337 客户端下载地址&#xff1a;https://download.csdn.net/download/XiBuQiuChong/88805337 FlashMeeting(基于FFmpegopenCV)是一整套先进的以FFmpegopenCV技术为基础的视频语音通讯系统。利…

linux基础IO【文件操作】

目录 前言&#xff1a; 1.文件理解 2.C语言文件操作 2.1文件打开 2.2文件关闭 2.3文件写入 2.4文件读取 3.系统文件操作 3.1open 3.2close 3.3write 3.4read 4.访问文件本质 前言&#xff1a; 我们在学习文件操作之前先要了解文件的构成&#xff0c;文件 内容 属…

职业性格在求职应聘和跳槽中的作用

性格测试对跳槽者的影响大不大&#xff1f;首先我们要弄清楚两个问题&#xff0c;性格对我们的职业生涯又没有影响&#xff0c;性格测试是什么&#xff0c;职场中有哪些应用&#xff1f;性格可以说从生下来就有了&#xff0c;随着我们的成长&#xff0c;我们的性格也越来越根深…

Stable Diffusion教程——常用插件安装与测试(一)

前言 随着Stable Diffusion不断演进&#xff0c;越来越多的开发者开始涉足插件开发。尽管网络上存在大量教程&#xff0c;但它们通常零散分布&#xff0c;逐个学习和查找非常耗时&#xff0c;使人感觉每天都在劳累思考。这里总结了Stable Diffusion常用的插件安装与测试方法。…

【JavaScript】点击选中和取消

效果图 &#xff08;1&#xff09;选中 &#xff08;2&#xff09;取消选中 实现 <template><div class"qualitityIssues"><div style"display: flex;"><div class"course-area"><div :class"checkoutIndex …