2016你应该使用SQLite的5个理由

Posted Python程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016你应该使用SQLite的5个理由相关的知识,希望对你有一定的参考价值。


Python部落(www.freelycode.com)组织翻译, 禁止转载


如果你还没有听说过,SQLite是一个能够在真实生产环境中实际工作中惊人的数据库。在这篇文章中,我将概述5个理由,为什么我认为你应该在2016使用SQLite。


容易管理


你有没有管理过Postgres数据库?为了确保数据库服务器配置正确,有很多事你需要了解(共享缓冲区,高速缓存的大小,运行内存,维护运行内存,wal缓冲…)。升级也可能是一个可怕的过程,你可能需要将数据库离线,运行一个程序来升级它,并希望它重新上线后能正常工作。而且,你知道你的Postgres数据库存储在哪里吗?你能准确的指着某处文件夹,说:“那是我的数据库吗”?


(现在,我们都知道在很多情况下,只有Postgres(或mysql、Oracle、SQLServer、等)能满足应用程序的要求。我的目的并不是想说SQLite能满足其他特殊情况。我只是想强调管理SQLite数据库相比于一个典型的数据库服务器的区别。)


SQLite是易于管理的,它是一个单一的文件(或文件+事务日志)。

文件格式相对于主要版本是稳定的,所以如果我有3.0.0版的一个SQLite数据库文件(回到2004),我可以用最新的SQLite 3.10.0来读取。如果我想把数据库文件随身带着,我只要复制文件,或者放在我的Dropbox文件夹。如果我想在每天晚上备份数据库,我只要同步数据库文件到S3。如果我想分享一些关于数据的分析给我的同事,我只要给他们寄一份数据库文件就可以了。具有稳定格式的单一文件中的数据库是一个功能。


更重要的是,SQLite是很容易配置的。SQLite的特点是两种方式管理:编译配置和运行时配置。


没有配置文件,您只需在您编译时把想要的功能加上,然后在创建数据库连接时配置运行时选项。


不断改善的稳定性


SQLite是由一些真正惊人的软件工程师积极发展。高质量的新功能以令人意想不到的速度在不断增加。

最近刚刚加入了通过json1扩展件对JSON数据支持的功能。

SQLite还发布了一个改进的全文检索的扩展版本,其中包括排序使用BM25算法。


除了增加新的功能,SQLite工程师也正在努力使库变得更高效。

在3.8.11版本,发行说明包含这个小广告:

SQLite现在运行的速度是3.8.0版本的两倍,3.3.9版本的三倍。


尽管有这么多的变化和改进,SQLite却很少有bug。

SQLite测试套件被广泛认为是在行业里最好的其中一个,关于SQLite是如何被测试的页面经常出现在HackerNews,源于越来越多的人发现这个奇妙的文档。



可扩展、可嵌入代码



无论是Python标准库SQLite的驱动pysqlite,还是替代的驱动apsw所提供的用于自定义SQL函数,聚合函数和排序规则的API都可以做到。apsw更进了一步,提供的API支持定义虚拟表和虚拟文件系统!


一个实际的例子,假设你在一个表中有一列存储URL,并且你希望确定最常见的主机名,如果你使用不同的数据库,你会被迫去写一个复杂的正则表达式,一个组合的字符串操作函数,或把数据推到你的应用程序里并在代码里进行计算。


有了SQLite,你就可以在Python中定义一个主机名的功能,然后使用它来创建一个简单的计数查询:


from urlparse import urlparse


def hostname(url):

    return urlparse(url).netloc


conn = sqlite3.connect('my-database.db')

conn.create_function('hostname', 1, hostname)  # name, num_params, func


SELECT hostname(mytable.url), COUNT(mytable.id) AS ct

FROM mytable

GROUP BY hostname(mytable.url)

ORDER BY ct DESC;


你还可以创建聚合函数,接受0个值,并生成一个输出值。也可以计算标准偏差,通过在某些方式中处理的值来产生一个字符串,做一些类型的分类,等等。虚拟表,目前只有apsw支持,允许你在代码中定义一个表,然后类似于查询一个正常的SQL表,即使数据完全动态。


例如,我写了一个简单的虚拟表,允许你把查询redis当作一个SQL表。比如一个正则表达式搜索功能,它处理输入和输出匹配的行。我写了一个库,SQLite vtfunc,这使得它非常容易写这些类型的功能。


SQLite的几乎每一个方面,都可以通过应用程序来操作。


闪电般快速



SQLite的速度弥补了它的一个被认为是最大的缺点,即写入时数据库文件锁。因为写入数据非常快,因此如果没有大量的并发写入时,数据库锁不会成为一个问题。


WAL模式


SQLite 3.7.0版本增加了一个新的日志记录方法,采用先写日志。这不是一个真正令人兴奋的消息,但它的意思是,对于网络应用程序开发人员(或任何处理并发性),读不再阻止写,反之亦然。或者换一种说法,读写可以同时发生。如果没有WAL模式,为了写入数据库,写动作将获得数据库的独家访问权,而读不可能发生在写完成之前。


下面是一个例子说明两者之间的区别。让我们说我们有2个进程,一个写和一个读。写打开一个专用的事务(准备写)。接下来,读会打开一个事务。读然后试图发出一个选择语句:


Journal mode = "delete" (the default):


Writer: BEGIN EXCLUSIVE

Reader: BEGIN

Reader: SELECT * FROM foo; Error: database is locked


Journal mode = "wal":


Writer: BEGIN EXCLUSIVE

Reader: BEGIN

Reader: SELECT * FROM foo; Returns table contents


然而,值得注意的是,即使你不启用WAL模式,写通常发生在毫秒,这是一个很小的时间。如果你有非常高的并发或很长的写事务,你才会注意到问题。


最终理由: BerkeleyDB


BerkeleyDB的SQLite的整合可以给应用开发者需要并发访问数据库的性能更好,因为不是锁定整个数据库BerkeleyDB只需要锁定单个页面(S)。这允许BerkeleyDB规模更有效的并行数据库负载下提供的事务不是争夺同一数据页。BerkeleyDB还支持多版本并发控制(MVCC),它允许读操作继续上一页正在运作的写事务数据出现。


BerkeleyDB的一个额外的好处是提高效率。换句话说,BerkeleyDB可以使用更少的系统资源和执行更少的系统调用。你可以在这份白皮书中找到更多的细节和简要技术概述。


BerkeleyDB的SQL接口更换为SQLite的下降,并支持相同的API和功能。BerkeleyDB提供了一些附加功能(SQLite的复制一个备份工具,但我的理解是,它不是作为BDB的功能),加密,当然所有BerkeleyDB的自身特点。


基于BerkeleyDB的一大缺点是配置值非常敏感,并且得到正确的页面大小,缓存大小等设置需要深厚的知识。另一个缺点是许可-阅读更多关于BerkeleyDB的许可证,检查Oracle的授权页面。


在编译使用BerkeleyDB Python SQLite驱动指令,看看这个帖子。


最后


我希望你会给SQLite一试。不要相信它不值得生产的FUD,或不适用于Web应用程序。


如果你想了解更多,SQLite本身有一个很好的文档描述了什么时候使用SQLite,其中还包括一个列表的情况下,另一个RDBMS的工作会更好。我也写了一个小短篇关于sqlite:小、快速、可靠。选择这三者优势之一。最后,你可以看看我的帖子标记“sqlite”更多的主题帖。


非常感谢你花时间阅读,我希望你会留下一个评论,如果你有任何问题,意见或建议!


英文原文: http://charlesleifer.com/blog/five-reasons-you-should-use-sqlite-in-2016/

译者: 蓝鳍豚


长按, 识别图中二维码

关注"Python程序员"




以上是关于2016你应该使用SQLite的5个理由的主要内容,如果未能解决你的问题,请参考以下文章

2016年应该使用SQLite的5大原因

2018,为何你应该使用 PostgreSQL,这几个也许就是理由了

你会喜欢Flutter的5个理由

喜爱Sahi的10个理由

4个理由告诉你Java为何排行第一

你应该雇佣老程序员的五个理由