该试试SQLite的5个理由
作者:网络转载 发布时间:[ 2016/6/14 10:09:12 ] 推荐标签:SQLite 数据库
如果你还没听说,SQLite是一款能够实际运作在真实产品环境中的惊艳的数据库。在这篇文章中,我会列出5大理由来解释为什么我认为你应该在2016年试试 SQLite。
简便管理
你管理过一个Postgres数据库吗?为了确保数据库服务器得到恰当设置(共享数据缓冲区,有效缓存大小,工作记忆,维持工作记忆,缓冲机制…)你需要明了相当多的事项。升级也会是一个可怕的过程,你也许需要离线你的数据库,运行一个程序来阻止它升级,并希望等你重启时它仍可以运行。更进一步说,你知道你的 postgres 数据库存储在哪吗?你可以指着一个地方说,「这是我的数据库吗」?
(现在,我们都知道在很多情况下只有 Postgres (或MySQL, Oracle, SQL Server等)可以满足应用上的要求。这里我的目的并不是说SQLite另有规定。而是我只想强调相比较于传统的数据库服务器,管理一个SQLite db数据库的不同点。
SQLite管理起来非常简便——它是一个单一的文件(或者有时是一个文件 + 事务日志)。文件格式在主要的版本中非常稳定,所以如果我在SQLite3.0.0版本上(2004年推出的版本)有数据库文件,我可以使用 SQLite 3.10.0版本读出它。如果我想把数据文件装在U盘中随身携带,我可以拷贝文件,或者目前更好的是我可保存在我的dropbox文件夹。如果我每天晚上都要备份这些文件,我只需把数据库文件同步到S3。如果我想共享我正与我同事合作的数据分析,我只需发送给他们这个数据库文件的一个我已准备好的副本。数据库在一个单一的文件中,且保持稳定的格式是SQLite的一大特性。
而且,SQLite设置起来也很方便。 SQLite的功能可以用两种方式来管理:编译标志 和 编译指示语句(运行时配置)。这里没有指明的配置文件,你只需把你想要的功能构建成库,然后在创建数据库连接时配置这些运行时选项。
不断改善目前已坚若磐石的稳定性
SQLite是由几个真正的软件工程师大神主动开发。并以惊人的速度不断增加高质量的新功能。在前不久SQLite通过 json1拓展来支持JSON数据(获取更多关于在 Python上应用它的文章,请点击这篇文章)。SQLite还发布了一个改进的全文检索的扩展版本,其中包括使用BM25算法的结果排序。
除了增加新的功能,SQLite开发者也正在努力使库的使用更高效。在3.8.11版本,发行说明包含这条宣传语:
SQLite如今的速度是 3.8.0版本速度的两倍,是 3.3.9版本速度的3倍。
尽管有了这些变化和改进,SQLite鲜少出现 bug。SQLite测试套件被广泛认为是行业内佳之一,在开发者发现这个令人印象深刻的文件后,SQLite如何测试的页面经常出现在HackerNews上。
可拓展性和可控性
我个人喜欢的特性是它的可扩展性。因为SQLite是由你的应用程序插入的,它运行在相同的地址空间,可以代表你执行应用程序代码。无论是Python标准库SQLite驱动,pysqlite,和替代驱动apsw提供的APIs来定义自定义的SQL函数,聚合函数和排序规则。apsw更进了一步,提供APIs定义虚拟表和虚拟文件系统!
举一个实际的例子,假设在你的数据表中有一列存储 URLs,你希望确定哪个是常见的主机名——如果你正使用不同的数据库,你会被迫去写一个复杂的正则表达式,一个字符串操作函数的组合,或把数据放入你的应用程序并在代码中进行运算。而有了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..n 值,并生成一个单个输出值。例子可能是计算标准偏差、通过用一些方式处理值来产生字符串、或者做一些类型的分类等等。
虚拟表,目前只受apsw支持,允许你在代码中定义一个表,然后把它当作一个正常的SQL表来查询,即使后台的数据完全是动态的。举例来说,我写了一个简单的虚拟表,可以允许你像查询SQL表一样来查询Redis.
你也可以写同名的函数,其中函数返回0..n行结果。正则表达式搜索函数也许是个例子,它处理输入值和产生匹配令牌的行。我写了一个库,sqlite vtfunc,它使得写这些类型的函数变得极其容易。
SQLite的每个方面都可以被你的应用程序操作。
Lightning fast
SQLite运行起来很快。它在同一个机器上运行,所以在执行查询和读出结果时没有网络管理费用。它在同一个地址空间运行,所以没有有线协议,串行化或需要通过UNIX套接字通信 。SQLite可以在资源匮乏、要求高效率的无线设备上运行。SQLite也支持大量编制标志,允许你移除不打算用的功能。
SQLite的速度弥补了他的大的缺陷,是数据库文件锁定为写。正因为写数据的速度快到不可思议,只有当存在大量的并发作者时,数据库的锁定才会成为一个问题。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11