【sql】sqlite3数据库

一、介绍

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.mfbz.cn/a/387265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷最新Node.js 学习笔记(二)

目录 五、HTTP协议 5.1、概念 5.2、请求报文的组成 5.3、HTTP 的请求行 5.4、HTTP 的请求头 5.5、HTTP 的请求体 5.6、响应报文的组成 5.7、创建HTTP服务 操作步骤 测试 注意事项 5.8、浏览器查看 HTTP 报文 查看请求行和请求头 查看请求体 查看URL查询字符串 …

如何在Django中使用分布式定时任务并结合消息队列

如何在Django中使用分布式定时任务并结合消息队列 如何在Django中使用分布式定时任务并结合消息队列项目背景与意义实现步骤1. 安装Celery和Django-celery-beat2. 配置Celery3. 配置Django-celery-beat4. 定义定时任务5. 启动Celery worker 和 beat6. Celery 指令7. 对接消息队…

ClickHouse--08--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…

基于LightGBM的回归任务案例

在本文中&#xff0c;我们将学习先进的机器学习模型之一&#xff1a;Lightgbm。在对XGB模型进行了越来越多的改进以获得更好的性能之后&#xff0c;XGBoost是一种极限梯度提升机器&#xff0c;但通过lightgbm&#xff0c;我们可以在没有太多计算的情况下实现类似或更好的结果&a…

对(一维)数组与指针的深入理解(1)

目录 1.数组名的理解2.使用指针访问&#xff08;一维&#xff09;数组3.&#xff08;一维&#xff09;数组传参的本质 1.数组名的理解 以前我们在使用指针访问数组内容时&#xff0c;有这样的代码&#xff1a; #include <stdio.h>int main() {int arr[10] { 1,2,3,4,5…

CTF-web 之 burp suite 使用

burp suite 使用 一般其是作为一个辅助工具&#xff0c;直接使用来解题的部分是少数&#xff0c;我们可以使用它来观察请 求和响应&#xff0c;并且可以反复的提交&#xff0c;关键的是他还带有很多其他的功能&#xff0c;在我们做题的过程中&#xff0c; 使用的关键点包括&…

C++LNK1207中的 PDB 格式不兼容;请删除并重新生成

在打开别人发的C文件时&#xff0c;可能出现该报错 解决办法 打开资源管理器&#xff0c;找到原来的路径 进入Debug&#xff0c; 找到对应的PDB文件删除即可。

OpenAI ChatGPT 记忆功能怎么实现?

你的聊天助手现在能“记住”你的对话了&#xff01; 2月14日凌晨&#xff0c;OpenAI宣布正在测试ChatGPT的新功能——记住用户提问内容&#xff0c;并自由控制内存。这意味着&#xff0c;ChatGPT能帮你记住那些重要的聊天内容&#xff0c;让你的对话更流畅、更自然。 想象一下…

政安晨:【示例演绎】【用TensorFlow编写线性分类器】—— 同时了解一点TensorFlow与Keras的基本概念

环境准备 如果小伙伴们第一次接触TensorFlow与Keras&#xff0c;可以先看一下我的这篇文章做些环境准备&#xff08;可以先忽略这篇文章里面代码实现部分&#xff0c;仅查看这里的环境准备部分即可&#xff09;。 文章如下&#xff1a; 政安晨&#xff1a;【详细解析】【用T…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术&#xff0c;通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像&#xff0c;特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

Spring 事务原理总结四

作为一名认知有限的中国人&#xff0c;我对年的喜爱&#xff0c;胜过其他一切&#xff0c;因为它给了我拒绝一切的合理理由。每到这个时候&#xff0c;我都会用各种理由来为自己的不作为开脱&#xff0c;今年亦是如此。看着频频发出警报的假期余额&#xff0c;我内心的焦躁变得…

VSCode无法连接远程服务器的两种解决方法

文章目录 VSCode Terminal 报错解决方式1解决方式2you are connected to an OS version that is unsupported by Visual Studio Code解决方法 VSCode Terminal 报错 直接在terminal或cmd中使用ssh命令可以连接服务器&#xff0c;但是在vscode中存在报错&#xff0c;最后一行为…

第12讲创建图文投票实现

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b; <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&qu…

第13章 网络 Page724 asio定时器

程序代码&#xff1a; 11行&#xff0c;声明一个ios对象 13行&#xff0c;使用ios对象作为参数声明一个定时器&#xff0c;此时&#xff0c;定时器和ios完成了关联&#xff0c;后面定时器如果有任务的话&#xff0c;就可以将任务交给ios 16行&#xff0c;为定时器设置一个定…

Vue3+Vite+TS+Pinia+ElementPlus+Router+Axios创建项目

目录 初始项目组成1. 创建项目1.1 下载项目依赖1.2 项目自动启动1.3 src 别名设置vite.config.ts配置文件tsconfig.json配置若新创项目ts提示1.4 运行测试2. 清除默认样式2.1 样式清除代码下载2.2 src下创建公共样式文件夹`style`2.3 main.js中引入样式2.4 安装`sass`解析插件2…

Unity(单元测试)在STM32上的移植与应用

概述 Unity Test是一个为C构建的单元测试框架。本文基于STM32F407为基础&#xff0c;完全使用STM32CubeIDE进行开发&#xff0c;移植和简单使用Unity。 单片机型号&#xff1a;STM32F407VET6 软件&#xff1a;STM32CubeIDE Version: 1.14.1 Unity Version&#xff1a;2.…

小结与数字的魅力的开篇

小结 本系列主要介绍了一些排序算法&#xff0c;包括冒泡排序、快速排序、直接插入排序、希尔排序、简单选择排序、堆排序、归并排序、计数排序、桶排序和基数排序。 排序算法本身并不难&#xff0c;但其涉及的知识点却星罗棋布&#xff0c;其变化莫测的思路更让人难以捉摸&am…

【数据结构】哈希桶封装出map和set

利用之前的哈希桶封装出unordered_map和unordered_set。 这个封装并不简单&#xff0c;迭代器的使用&#xff0c;模板参数的繁多&#xff0c;需要我们一层一层封装。 map是一个k - v类型&#xff0c;set是k类型&#xff0c;那么就明确了如果需要封装&#xff0c;底层的tables…

Python算法探索:从经典到现代(三)

一、引言 随着信息技术的飞速发展&#xff0c;数据已经成为现代社会不可或缺的资源。Python&#xff0c;作为数据处理和分析的利器&#xff0c;为我们提供了大量强大的库和工具&#xff0c;用于从经典到现代的各种算法探索。本文将带你领略Python在算法领域的魅力&#xff0c;从…

OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区

&#x1f989; AI新闻 &#x1f680; OpenAI宣布ChatGPT新增记忆功能&#xff0c;可以自由控制内存&#xff0c;提供个性化聊天和长期追踪服务 摘要&#xff1a;ChatGPT新增的记忆功能可以帮助AI模型记住用户的提问内容&#xff0c;并且可以自由控制其内存。这意味着用户不必…
最新文章