该试试SQLite的5个理由

发表于:2016-6-14 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:丢失的薄荷    来源:51Testing软件测试网采编

  如果你还没听说,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的速度弥补了他的最大的缺陷,就是数据库文件锁定为写。正因为写数据的速度快到不可思议,只有当存在大量的并发作者时,数据库的锁定才会成为一个问题。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号