一、介绍
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;
注意以下几点:
- 将
AUTO_INCREMENT
更改为AUTOINCREMENT
,这是SQLite的自增关键字。 - 将
VARCHAR
类型更改为TEXT
,因为SQLite没有VARCHAR
类型,它使用TEXT
来存储字符串。 - 将
DECIMAL
类型更改为REAL
,因为SQLite没有DECIMAL
类型,它使用REAL
来存储浮点数。 - 由于
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语句创建了相应的数据库表,并定义了主键和外键约束。