如何以及何时使用 Sqlite

注意:本教程使用不推荐使用的 Ubuntu 版本。单击此处阅读为 Ubuntu 20.04 编写的更新版本

Sqlite 是一个非常简单和快速的开源 SQL 引擎。本教程将解释什么时候最好使用 Sqlite,而不是像 Mysql 或 Postgres 这样的成熟的 RDBMS,以及如何安装它以及涵盖 CRUD – 创建、读取、更新和删除的基本使用示例。

误解


不要误以为Sqlite 仅用于测试和开发。例如,它适用于每天最多接收 100,000 次点击的网站——这是一个保守的限制。Sqlite 数据库的最大大小为 140 TB(这应该足够了,对吧?),它比成熟的 RDBMS 快得多。完整的数据库和所有其他必要的数据都存储在主机文件系统中的一个普通文件中,因此不需要单独的服务器进程(消除对缓慢的进程间通信的所有需求)。

在您的 VPS 上优化使用


Sqlite 专注于简单性。因为它完全是内部的,所以它通常比替代方案快得多。如果您正在寻找可移植性(关于语言和平台)、简单性、速度和小的内存占用,Sqlite 是理想的选择。它的缺点只有在需要高读写并发的情况下才会明显:Sqlite 一次只能支持一个 writer,如果需要多个客户端同时访问一个 Sqlite 数据库,通常较高的文件系统延迟可能会带来不便。最后一个可能的缺点是它的语法虽然与其他 SQL 系统相似,但却是独一无二的。虽然迁移到另一个系统相当简单,但如果您“超出”Sqlite,则转换过程中会涉及一些开销。

有关更多信息,官方文档中对 Sqlite 的优缺点有一些非常好的概述

在您的 VPS 上安装 Sqlite


sqlite3 模块是标准 Python 库的一部分,因此在标准 Ubuntu 安装或任何安装了 Python 的系统上,绝对不需要进一步安装。要在 Ubuntu 上安装 Sqlite 命令行界面,请使用以下命令:

sudo apt-get update
sudo apt-get install sqlite3 libsqlite3-dev

如果您需要从源代码编译它,请从官方 SQLite 网站获取最新的 autoconf 版本在撰写本文时:

wget http://sqlite.org/2013/sqlite-autoconf-3080100.tar.gz
tar xvfz sqlite-autoconf-3080100.tar.gz
cd sqlite-autoconf-3080100
./configure
make
make install

(从源代码构建的注意事项:1)不要在标准的 Ubuntu 安装上执行此操作,因为由于已安装的版本和新安装的版本之间存在冲突,您可能会收到“头文件和源代码版本不匹配”错误。2) 如果make命令似乎需要进一步输入,请耐心等待,因为源代码可能需要一段时间来编译)。

基本命令行界面使用


要创建数据库,请运行以下命令:

sqlite3 database.db

其中 ‘database’ 是您的数据库的名称。如果文件database.db已经存在,Sqlite 会打开一个连接;如果它不存在,它将被创建。您应该会看到类似于以下内容的输出:

SQLite version 3.8.1 2013-10-17 12:57:35
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

现在让我们创建一个表并插入一些数据。这个名为“wines”的表有四列:对于 ID,葡萄酒的生产商、葡萄酒的种类和葡萄酒的原产国。由于现在还不是星期五,我们将只在我们的数据库中插入三种葡萄酒:

CREATE TABLE wines (id integer, producer varchar(30), kind varchar(20), country varchar(20)); 
INSERT INTO WINES VALUES (1, "Rooiberg", "Pinotage", "South Africa");
INSERT INTO WINES VALUES (2, "KWV", "Shiraz", "South Africa");
INSERT INTO WINES VALUES (3, "Marks & Spencer", "Pinot Noir", "France");

我们已经创建了数据库、一个表和一些条目。现在按下Ctrl + D退出 Sqlite 并键入以下内容(再次用您的数据库名称替换“database”),这将重新连接到我们刚刚创建的数据库:

sqlite3 database.db

现在输入:

SELECT * FROM wines;

您应该会看到我们刚刚创建的条目:

1|Rooiberg|Pinotage|South Africa
2|KWV|Shiraz|South Africa
3|Marks & Spencer|Pinot Noir|France

伟大的。这就是创造和阅读。让我们做一个更新和删除:

UPDATE wines SET country="South Africa" WHERE country="France";

这将更新数据库,因此所有被列为来自法国的葡萄酒将被列为来自南非。检查结果:

SELECT * FROM wines;

你应该看到:

1|Rooiberg|Pinotage|South Africa
2|KWV|Shiraz|South Africa
3|Marks & Spencer|Pinot Noir|South Africa

现在我们所有的葡萄酒都来自南非。让我们喝下 KWV 庆祝一下,并将其从我们的数据库中删除:

DELETE FROM wines WHERE id=2;
SELECT * FROM wines;

我们应该会看到酒窖里少了一种酒:

1|Rooiberg|Pinotage|South Africa
3|Marks & Spencer|Pinot Noir|South Africa

这涵盖了所有基本的数据库操作。在完成之前,让我们再尝试一个(稍微)不那么简单的示例,它使用两个表和一个基本连接。

使用命令退出 SqliteCtrl + D并使用sqlite3 database2.db.

我们将创建一个非常相似的wines表,但也是一个countries存储国家名称和现任总统的表。让我们先创建国家表,然后将南非和法国插入其中(请注意,您可以一次复制粘贴几行 sqlite 代码):

CREATE TABLE countries (id integer, name varchar(30), president varchar(30));
INSERT INTO countries VALUES (1, "South Africa", "Jacob Zuma");
INSERT INTO countries VALUES(2, "France", "Francois Hollande");

然后我们可以重新创建我们的葡萄酒表:

CREATE TABLE wines (id integer, kind varchar(30), country_id integer);
INSERT INTO wines VALUES (1, "Pinotage", 1);
INSERT INTO wines VALUES (2, "Shiraz", 1);
INSERT INTO wines VALUES (3, "Pinot Noir", 2);

现在让我们看看南非有哪些葡萄酒:

SELECT kind FROM wines JOIN countries ON country_id=countries.id WHERE countries.name="South Africa";

你应该看到:

Pinotage
Shiraz

这涵盖了基本的 Join。请注意,Sqlite 为您做了很多。在上面的 join 语句中,它默认为INNER JOIN,尽管我们只使用了关键字JOIN我们也不必指定,wines.country_id因为它是明确的。另一方面,如果我们尝试以下命令:

SELECT kind FROM wines JOIN countries ON country_id=id WHERE country_id=1;

我们会收到错误信息Error: ambiguous column name: id这很公平,因为我们的两个表都有一id列。但通常 Sqlite 是相当宽容的。它的错误消息往往使定位和修复任何问题变得相当简单,这有助于加快开发过程。

如需语法方面的进一步帮助,官方文档中充满了像这样的图表,这可能会有所帮助,但如果您更喜欢具体的示例,这里有一个教程链接,其中包含对大多数连接类型的很好的概述

最后,Sqlite 具有所有主要语言的包装器和驱动程序,并且可以在大多数系统上运行。可以在此处找到其中许多的列表

觉得文章有用?

点个广告表达一下你的爱意吧 !😁