# SQLite

# SQLite 是什么

SQLite 是一种轻量级的关系型数据库管理系统(RDBMS),它是一个嵌入式的、无服务器的、零配置的SQL数据库引擎。

SQLite 的设计目标是为那些需要一个小型数据库解决方案的应用程序提供一个可靠的、高效的、自包含的解决方案。

SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。

SQLite 的数据库是一个单一的文件,可以直接在多个平台上使用,包括Windows、Linux、Unix和Mac OS X等

SQLite 被广泛用于移动设备、嵌入式设备、桌面应用程序和Web浏览器等领域,是在世界上最广泛部署的 SQL 数据库引擎。

SQLite 源代码不受版权限制。

# SQLite 的历史

2000 -- D. Richard Hipp 设计 SQLite 是为了不需要管理即可操作程序。

2000 -- 在八月,SQLite1.0 发布 GNU 数据库管理器(GNU Database Manager)。

2011 -- Hipp 宣布,向 SQLite DB 添加 UNQl 接口,开发 UNQLite(面向文档的数据库)。

# SQL 和 RPC

sql command rpc path crud
SELECT get read
INSERT add create
UPDATE modify update
DELETE delete delete

# 安装 SQLite

SQLite 不需要配置,这意味着不需要复杂的安装或管理。

https://www.sqlite.org/download.html (opens new window)v

  1. 下载 sqlite-tools-win32-*.zipsqlite-dll-win32-*.zip 压缩文件
  2. 解压压缩文件得到 sqlite3.defsqlite3.dllsqlite3.exe 文件,复制到 D:\software\sqlite3
  3. 添加 D:\software\sqlite3PATH 环境变量,最后在命令提示符下,使用 sqlite3 命令

# SQLite 命令

与关系数据库进行交互的标准 SQLite 命令类似于 SQL。

命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。

这些命令基于它们的操作性质可分为以下几种:

# DDL - 数据定义语言 Define

命令 描述
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。
CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

# DML - 数据操作语言 Manipulation

命令 描述
INSERT 创建一条记录。
UPDATE 修改记录。
DELETE 删除记录。
INSERT INTO lorem VALUES ('gausszhou')

# DQL - 数据查询语言 Query

命令 描述
SELECT 从一个或多个表中检索某些记录。
SELECT rowid AS id, info FROM lorem

# SQLite 创建数据库

SQLite 的 sqlite3 命令被用来创建新的 SQLite 数据库。您不需要任何特殊的权限即可创建一个数据。

# 语法

sqlite3 命令的基本语法如下:

sqlite3 DatabaseName.db

通常情况下,数据库名称在 RDBMS 内应该是唯一的。另外我们也可以使用 .open 来建立新的数据库文件:

sqlite>.open test.db

上面的命令将在当前目录下创建一个文件 testDB.db。该文件将被 SQLite 引擎用作数据库。如果您已经注意到 sqlite3 命令在成功创建数据库文件之后,将提供一个 sqlite> 提示符。

一旦数据库被创建,您就可以使用 SQLite 的 .databases 命令来检查它是否在数据库列表中,如下所示:

sqlite> .database
main: D:\Github\Demo\node-sqlite-demo\db\testDB.db r/w

# Dump

您可以在命令提示符中使用 SQLite .dump 点命令来导出完整的数据库在一个文本文件中,如下所示:

sqlite3 testDB.db .dump > testDB.sql

上面的命令将转换整个 testDB.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 testDB.sql 中。您可以通过简单的方式从生成的 testDB.sql 恢复,如下所示:

sqlite3 testDB.db < testDB.sql

# 附加和分离

# SQLite 附加数据库

假设这样一种情况,当在同一时间有多个数据库可用,您想使用其中的任何一个。SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 SQLite 语句将在附加的数据库下执行。

test.db
testDB.db
sqlite> ATTACH DATABASE 'test.db' as 'TEST';
sqlite> .databases
main: D:\Github\Demo\node-sqlite-demo\db\test.db r/w
TEST: D:\Github\Demo\node-sqlite-demo\db\test.db r/w

数据库名称 main 和 temp 被保留用于主数据库和存储临时表及其他临时数据对象的数据库。这两个数据库名称可用于每个数据库连接,且不应该被用于附加,否则将得到一个警告消息,如下所示:

sqlite>  ATTACH DATABASE 'testDB.db' as 'TEMP';
Error: database TEMP is already in use
sqlite>  ATTACH DATABASE 'testDB.db' as 'main';
Error: database main is already in use

# SQLite 分离数据库

SQLite 的 DETACH DATABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 ATTACH 语句附加的。

假设在前面的章节中您已经创建了一个数据库,并给它附加了 'test' 和 'currentDB',使用 .database 命令,我们可以看到:

sqlite>.databases
seq  name             file
---  ---------------  ----------------------
0    main             /home/sqlite/testDB.db
2    test             /home/sqlite/testDB.db
3    currentDB        /home/sqlite/testDB.db

现在,让我们尝试把 'currentDB' 从 testDB.db 中分离出来,如下所示:

sqlite> DETACH DATABASE 'currentDB'; 现在,如果检查当前附加的数据库,您会发现,testDB.db 仍与 'test' 和 'main' 保持连接。

sqlite>.databases
seq  name             file
---  ---------------  ----------------------
0    main             /home/sqlite/testDB.db
2    test             /home/sqlite/testDB.db

# SQLite 增删改查

# 增 INSERT

insert into table [(column)] values(value)

INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
var sqlite3 = require("sqlite3");
var db = new sqlite3.Database("./db/test1.db", function () {
  db.run("create table user(name varchar(15))", function () {
    db.run("insert into user values('gausshou')", function () {
      db.all("select * from user", function (err, res) {
        if (!err) console.log(JSON.stringify(res));
        else console.log(err);
      });
    });
  });
});

# 删 DELETE

delete from table where [condition]

DELETE FROM table_name
WHERE [condition];

# 改 UPDATE

update table set column = value where [condition]

UPDATE table_name
SET column1 = value1, column2 = value2, columnN = valueN
WHERE [condition];

# 查 SELECT

SELECT * FROM table_name;
SELECT ID, NAME, SALARY FROM COMPANY;

# SQLite NodeJS

var fs = require("fs");
var file = "./db/test2.db"; //这里写的就是数据库文件的路径
var exists = fs.existsSync(file);
var sqlite3 = require("sqlite3").verbose();
var db = new sqlite3.Database(file);

db.run("DROP TABLE COMPANY");
db.run(`CREATE TABLE COMPANY(
  ID INT PRIMARY KEY     NOT NULL,
  NAME           TEXT    NOT NULL,
  AGE            INT     NOT NULL,
  ADDRESS        CHAR(50),
  SALARY         REAL
)`);

//增
var sql1 = db.prepare(`
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );
`);
sql1.run();
//删
var sql2 = db.prepare("DELETE FROM COMPANY where id = 2");
sql2.run();
//改

var sql3 = db.prepare("UPDATE COMPANY SET NAME = Paul where id = 1");
sql3.run();
//查
//查一个表的所有数据
db.all("select * from COMPANY", function (err, row) {
  console.log(JSON.stringify(row));
});
//查一条数据
db.each("select * from COMPANY", function (err, row) {
  console.log(row);
});

# 学习资料

简书 - NodeJS中使用SQLite3 (opens new window)

菜鸟教程 - SQLite 教程 (opens new window)