介绍
大量的应用程序需要数据库后端来存储和有效地查询数据。 虽然传统上,关系数据库管理系统是最受欢迎的,非关系模型正在以快速的速度获得牵引力。
即专注于简单易用的编程环境中的一个有趣的非SQL数据库RethinkDB。 RethinkDB是一个易于配置的JSON文档存储数据库,可以轻松扩展。
使RethinkDB易于使用编程语言的一个特性是它支持强大的客户端驱动程序。 这些允许您使用大多数熟悉的编程语言的语法与数据库交互。
在本指南中,我们将在Ubuntu 12.04 VPS上安装和配置RethinkDB。 我们将使用Python客户端驱动程序与它进行交互,以演示如何使用本机或接近本机的编程结构访问其查询语言。
安装
有两个组件需要安装以充分利用RethinkDB设计。 第一个是数据库本身。 第二个是客户端驱动程序,它提供对从所选编程语言访问数据库的支持。
我们将在这里讨论这两个组件。
安装RethinkDB数据库软件
RethinkDB软件不在Ubuntu 12.04的默认存储库中。 幸运的是,该项目通过维护自己的PPA(个人包存档)使其易于安装。
到PPA添加到Ubuntu 12.04,我们必须先安装python-software properties
包,其中包括我们所需要的命令。 更新包索引,然后安装它:
sudo apt-get update
sudo apt-get install python-software-properties
现在我们已经安装了软件属性包,我们可以添加RethinkDB项目的PPA。 键入以下内容以将此存储库添加到我们的系统:
sudo add-apt-repository ppa:rethinkdb/ppa
现在,我们需要更新我们的包索引以收集有关我们可用的新包的信息。 之后,我们可以安装RethinkDB软件:
sudo apt-get update
sudo apt-get install rethinkdb
我们现在有数据库软件可用,可以访问它的功能。
安装Python客户端驱动程序
虽然我们已经安装了数据库本身,我们现在应该为数据库系统安装客户端驱动程序。 根据您选择的编程语言,有许多客户端驱动程序的选项。
官方支持的语言是JavaScript,Ruby和Python。 社区还增加了对更多语言的支持,包括C,Clojure,Lisp,Erlang,Go,Haskell,Java,Perl,PHP,Scala等。
在本指南中,我们将使用Python客户端驱动程序,因为Python已经安装在我们的系统上。 我们将安装客户端驱动程序使用pip
,Python的包管理器。
要使用Python的软件打交道时遵循一些建议的最佳实践,我们将使用virtualenv
我们的Python环境隔离开来。 这个包包括pip作为依赖。
sudo apt-get install python-virtualenv
现在我们已经安装了virtualenv和pip,我们可以在我们的主文件夹中创建一个目录来安装我们的虚拟环境:
cd ~
mkdir rethink
切换到目录,然后使用virtualenv命令创建新的虚拟环境结构:
cd rethink
virtualenv venv
我们可以通过键入以下内容来激活环境:
source venv/bin/activate
这将允许我们在隔离环境中安装组件,而不会影响我们的系统程序。 如果我们需要离开环境(现在不要这样做,因为我们需要环境),请键入:
deactivate
现在我们已经启用了一个虚拟环境,我们可以通过键入以下命令来安装RethinkDB包:
pip install rethinkdb
我们的Python客户端驱动程序现在已安装并可以使用。
启动RethinkDB并浏览Web界面
要开始探索RethinkDB系统,我们将启动一个服务器,并使用内置的Web界面进行探索。
从命令行,我们可以使用以下格式启动服务器实例:
rethinkdb --bind all
该--bind all
参数是必要的,以便为您的实例是从服务器本身之外的访问。 由于我们是从远程VPS运行,这是一个必要的补充。
如果我们访问我们的Droplet的IP地址,然后是:8080
,我们将看到RethinkDB Web界面:
your_server_ip_address:8080
正如你所看到的,我们有一个丰富的数据库服务器接口可用。
我们可以在主视图中看到一些标准的运行状况检查和一些集群性能指标。 在页面的下方,显示最近记录的活动。
我们还看到一些关于我们的数据库的统计数据。 在蓝色图标旁边,界面会告诉我们数据库的名称,以及是否检测到任何问题。
此外,您可以看到RethinkDB本地理解服务器和数据中心。 这是因为RethinkDB是从根本上构建的,易于扩展和可分发。
如果我们点击页面顶部的“表”链接,我们可以看到我们已经添加到我们的数据库的任何表:
从这里,我们可以看到我们在服务器中的所有数据库。 在每个数据库中,我们可以看到已创建的表。 概述还告诉我们为每个组件配置的分片和复制。
我们还可以从此视图添加数据库和表。
如果我们单击一个表,我们可以看到负载,分布和文档计数的概述:
我们可以在这里看到更多关于每个表的负载和配置的详细信息。 我们可以编辑分片和复制设置,并添加索引以便更有效地查询。
移动到顶部的下一个链接,我们可以看到可用于我们的数据库和表的服务器。
从这里,我们可以管理和添加数据库,这是将不同服务器分组在一起的方式。 如果您在不同的物理位置部署服务器,这是跟踪一切都在哪里的简单方法。 更改服务器关联的数据中心也很容易。
再次,您可以单击单个服务器以获取其属性的概述:
转到标题为“Data Explorer”的下一个链接,我们给出了一个接口,可以使用查询语言与服务器交互:
我们可以在此界面中创建,删除和修改表和数据。
如果我们输入查询或命令,我们可以看到下面的结果。 我们可以查看各种格式的信息,还可以查询配置文件来查看数据库如何确定返回结果:
如您所见,我们有一个伟大的工具,用于高级管理我们的数据库和集群。
在Python中与RethinkDB交互
虽然Web界面干净,易于使用,但在大多数情况下,您可能不会与数据库进行交互。 大多数数据库在程序中使用。
在后台启动服务器
如果您不熟悉后台进程管理,我们将简要说明如何在后台启动服务器,以便您可以继续在终端中工作。
您可以通过在终端中按“Ctrl-C”关闭服务器。 然后,您可以在后台重新启动它,以便您可以访问终端,通过重新启动它:
rethinkdb --bind all &
在&
在后台启动进程,并允许您继续工作。
另一个选项是不杀死初始服务器进程,只是挂起服务器,然后在后台恢复它。 您可以通过键入“Ctrl-Z”来执行此操作。
然后,通过键入以下命令在后台恢复进程:
bg
您可以随时通过键入以下内容查看该过程:
jobs
[1]+ Running rethinkdb --bind all &
如果您需要再次将任务带到前台(可能在完成后将其杀死),您可以键入:
fg
然后任务将再次在前台可用。 如果您有多个后台进程,则可能需要使用以下格式引用作业号:
fg %num
一旦你的服务器在后台,我们可以开始通过Python探索数据库。
使用Python探索RethinkDB系统
启动Python解释器,以便我们可以开始与数据库交互:
python
从这里,我们只需要将客户端驱动程序导入到环境中:
import rethinkdb as r
我们现在可以使用connect命令与本地数据库连接:
r.connect("localhost", 28015).repl()
该.repl()
在最后让我们来调用时没有明确的范围内指定连接形成的连接上的命令.run()
调用。 这是为了方便在这种测试情况下使用。
现在,我们已经连接到我们的服务器,我们可以立即开始使用数据库了。
我们可以创建一个数据库,通过键入:
r.db_create("food").run()
我们现在有一个称为“食物”的数据库。 所述.run()
在端链命令是非常重要的。 RethinkDB命令看起来像本地代码,但它们实际上由RethinkDB客户端驱动程序翻译为本机数据库代码,并在服务器上远程执行。
运行命令是将其发送到服务器的命令。 如果我们没有加入.repl()
命令到初始服务器的连接,我们就必须列出这样的运行命令连接对象:
conn = r.connect("localhost", 28015)
r.db_create("food").run(conn)
这些前几个命令给你一个大体的想法如何命令链接使用RethinkDB。 可以创建复杂命令来一次执行多个操作。 这允许您制作可读的,顺序的命令链,它们都被翻译并立即发送到数据库,而不是多次调用。
现在我们有一个数据库,让我们做一个表:
r.db("food").table_create("favorites").run()
然后我们可以向表中添加一些数据。 RethinkDB使用灵活的模式设计,因此您可以添加任何种类的键值对。 我们将添加一些人,然后添加他们最喜欢的食物:
r.db("food").table("favorites").insert([
{ "person": "Randy", "Age": 26,
"fav_food": [
"banana",
"cereal",
"spaghetti"
]
},
{ "person": "Thomas", "Age": 8,
"fav_food": [
"cookies",
"apples",
"cake",
"sandwiches"
]
},
{ "person": "Martha", "Age": 52,
"fav_food": [
"grapes",
"pie",
"avocado"
]
}
]).run()
这将在我们的“收藏夹”表中创建三个JSON文档。 每个对象定义一个人,一个年龄,和一个人的最喜欢的食物的数组。
我们可以通过查询来打印出文档。 为此,我们只需要请求数据库和表,并且服务器将返回一个可迭代的对象,然后我们可以使用循环进行处理。
服务器将继续发出作为对象的数据,称为游标,被处理。 例如,我们可以打印一切:
c = r.db("food").table("favorites")
for x in c:
print x
{u'person': u'Martha', u'Age': 52, u'fav_food': [u'grapes', u'pie', u'avocado'], u'id': u'b888ec64-f2c9-4f85-9db6-f8b8a66626c6'}
{u'person': u'Thomas', u'Age': 8, u'fav_food': [u'cookies', u'apples', u'cake', u'sandwiches'], u'id': u'3aa7ae68-85b0-48b6-9726-76e810ea4c55'}
{u'person': u'Randy', u'Age': 26, u'fav_food': [u'banana', u'cereal', u'spaghetti'], u'id': u'f027a270-d5ac-4c33-ad91-53a7541ace82'}
这将依次打印每行。 在我们的示例中,由变量“c”表示的游标对象在服务器处理时被给予新数据。 这允许快速执行代码。
您可能已经注意到,我们添加到“收藏夹”表中的每个记录都已被赋予ID。 这是自动完成的,用于索引每个表的内容。
我们可以通过在命令链中添加另一个链接来过滤结果:
c = r.db("food").table("favorites").filter(r.row["fav_food"].count() > 3).run()
for x in c:
print x
{u'person': u'Thomas', u'Age': 8, u'fav_food': [u'cookies', u'apples', u'cake', u'sandwiches'], u'id': u'3aa7ae68-85b0-48b6-9726-76e810ea4c55'}
正如你所看到的,我们只是增加了一个.filter()
命令。 我们使用了r.row
引用“fav_food”键,然后计数条目的数量为每行。 我们做了一个简单的比较过滤掉那些谁拥有3或更少的喜爱的食物的人。
结论
如你所见,我们可以轻松自然地操作RethinkDB系统中的数据。 RethinkDB自豪于自己从开发的角度来看容易,而不牺牲轻松和无缝扩展的能力。
本指南仅介绍了基础知识,以介绍使用RethinkDB的一些方法。 如果您正在考虑在生产环境中使用它,则可能有助于探索系统的扩展和复制功能及其数据库感知网络功能。