如何以及何时使用 Sqlite
注意:本教程使用的是 Ubuntu 的弃用版本。单击此处阅读为 Ubuntu 20.04 编写的更新版本。
Sqlite 是一个非常简单且快速的开源 SQL 引擎。本教程将解释何时使用 Sqlite 是最佳选择,而不是使用成熟的 RDBMS(例如 Mysql 或 Postgres),以及如何安装它以及涵盖 CRUD(创建、读取、更新和删除)的基本使用示例。
误解
不要误以为 Sqlite 仅用于测试和开发。例如,它适用于每天最多接收 100,000 次点击的网站 - 这是保守的限制。Sqlite 数据库的最大大小为 140 TB(这应该足够了,对吧?),并且它比成熟的 RDBMS 快得多。完整数据库和所有其他必要数据存储在主机文件系统中的普通文件中,因此不需要单独的服务器进程(消除了所有缓慢的进程间通信的需要)。
优化 VPS 的使用
Sqlite 注重简单性。由于它是完全内部的,因此它通常比其他替代方案快得多。如果您正在寻找可移植性(就语言和平台而言)、简单性、速度和较小的内存占用,那么 Sqlite 是理想的选择。它的缺点只有在您需要高读写并发性时才会显现出来:Sqlite 一次只能支持一个写入器,并且如果需要许多客户端同时访问 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>
现在让我们创建一个表并插入一些数据。这个名为“葡萄酒”的表有四列: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 并输入以下内容(再次将数据库名称替换为“数据库”),这将重新连接到我们刚刚创建的数据库:
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
现在我们所有的葡萄酒都来自南非。让我们举杯庆祝,然后从数据库中删除它:
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
这涵盖了基本的连接。请注意,Sqlite 为您做了很多事情。在上面的连接语句中,它默认为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 在所有主要语言中都有包装器和驱动程序,并且可以在大多数系统上运行。[其中许多列表可在此处找到]( http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers " target="_blank")。