【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.hqwc.cn/news/469158.html

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

相关文章

VueCLI核心知识综合案例TodoList

目录 1 拿到一个功能模块首先需要拆分组件&#xff1a; 2 使用组件实现静态页面的效果 3 分析数据保存在哪个组件 4 实现添加数据 5 实现复选框勾选 6 实现数据的删除 7 实现底部组件中数据的统计 8 实现勾选全部的小复选框来实现大复选框的勾选 9 实现勾选大复选框来…

耳机壳UV树脂制作私模定制耳塞需要注意什么问题?

制作私模定制耳塞需要注意以下问题&#xff1a; 耳模制作&#xff1a;获取准确的耳模是制作私模定制耳塞的关键步骤。需要使用合适的材料和方法&#xff0c;确保耳模的准确性和稳定性。材料选择&#xff1a;选择合适的UV树脂和其它相关材料&#xff0c;确保它们的质量和性能符…

Sentinel 流控-链路模式

链路模式 A B C 三个服务 A 调用 C B 调用 C C 设置流控 ->链路模式 -> 入口资源是 A A、B 服务 package com.learning.springcloud.order.controller;import com.learning.springcloud.order.service.BaseService; import org.springframework.beans.factory.annotatio…

TiDB 在医疗保障信息平台的应用实践

文章介绍了 TiDB 在医疗保障信息平台中的应用。东软医保云应用管理平台通过与 TiDB 联合&#xff0c;成功满足了医疗保障业务中高并发、实时性和复杂查询的要求。在某地市医疗保障信息平台的实践中&#xff0c;TiDB 分布式数据库有效实现了在线交易和实时分析服务&#xff0c;日…

Linux查看日志的几种方法总结

文章目录 摘要1、tailtail命令参数&#xff1a;tail命令的具体例子&#xff1a; catcat 命令的基本用法cat 命令的参数 与其他命令组合使用示例 1&#xff1a;搜索特定文本示例 2&#xff1a;显示匹配行的行号示例 3&#xff1a;忽略大小写搜索示例 4&#xff1a;显示不匹配的行…

vue3+ts+vite+uniapp项目常见问题

vue3tsvite中""路径失效的问题 ""需要进行配置&#xff1a; 首先npm install types/node --save-dev&#xff08;需要用到node其中的path&#xff09;接着在vite.config.ts配置文件中进行配置&#xff1a; 引入 import path from ‘path’&#xff0c;然…

Spring 事务原理总结五

很抱歉&#xff0c;Spring事务本来应该在上一篇就结束的&#xff0c;但因为梳理过程中发现了更多的未知知识&#xff0c;所以便再啰嗦几篇。本篇主要针对前一篇文章——《Spring 事务原理总结四》——末尾提到的几个问题进行梳理&#xff0c;这里再回顾一下这几个问题&#xff…

JavaWeb学习|i18n

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 i18n 国际化&#xff08;Internationalization&#xff09;指的是同一个网站可以支持多种不同的语言&…

数据库从入门到精通(一)数据库基础操作

mysql数据库基础操作 cmd下启动mysql数据库操作命令数据库重要的删除操作数据库增删改查操作插入数据更新数据删除数据查询数据查询指定记录in查询满足指定范围之内的条件记录not in查询不在指定范围之内的条件记录带between and 的范围查询带like的字符匹配查询(d%以d开头,%d以…

如何使用idea连通服务器上的Redis(详细版本)

这里我使用的是阿里云的服务器 打开阿里云的安全组&#xff0c;设置端口为6379 在redis.conf文件中&#xff0c;注释bind 127.0.0.1 将protected-mode设置为no&#xff0c;即关闭保护模式 更改服务器中的防火墙&#xff0c;放行6379端口 # 放行端口 firewall-cmd --zo…

【lesson53】线程控制

文章目录 线程控制 线程控制 线程创建 代码&#xff1a; 运行代码&#xff1a; 强调一点&#xff0c;线程和进程不一样&#xff0c;进程有父进程的概念&#xff0c;但在线程组里面&#xff0c;所有的线程都是对等关系。 错误检查: 传统的一些函数是&#xff0c;成功返回0&…

如何用 ChatGPT 做项目管理?

ChatGPT 可以通过创建和维护跨团队项目协作计划&#xff0c;让员工更容易理解他们的角色和职责。 这个协作计划里面会包括每个团队或个人要执行的具体任务&#xff0c;每个任务最后期限和任何事情之 间的依赖关系。 该场景对应的关键词库:(24 个) 项目管理、项目协作计划、跨…