使用语言绑定
要将 NoSQL 解决方案包含在应用程序堆栈中,强大而灵活的语言绑定允许从一些最流行的语言访问和操作这些存储,这一点非常重要。
本文介绍 NoSQL 存储和编程语言之间的两种类型的接口。
MongoDB的驱动程序
在本文中,四种不同语言(Java,PHP,Ruby和Python)的MongoDB驱动程序按其列出顺序介绍。
Mongo Java Driver
首先,从 github.com/mongodb 的 MongoDB github 代码存储库下载 MongoDB Java 驱动程序的最新发行版。所有官方支持的驱动程序都托管在此代码存储库中。最新版本的驱动程序是 2.5.2,因此下载的 jar 文件名为 mongo-2.5.2,jar。
再次通过从MongoDB发行版中运行
bin/mongod
来启动本地MongoDB服务器。现在使用 Java 程序连接到此服务器。查看示例 2-2 中的示例 Java 程序,该程序连接到 MongoDB,列出 prefs 数据库中的所有集合,然后列出位置集合中的所有文档。
在编译和运行这个时,请确保在类路径中包含MongoDB Java驱动程序程序。
运行程序时,输出如下:
localtion
system.indexes
{“_id” :{ “$oid” : “4c97053abe67000000003857”},“name”:“John Doe”, “zip” : 10001.0)
{ “_id” :{ “$oid” : “4c970541be67000000003858”},“name”:“Lee Chang”, “zip”: 94129.0)
{“_id”:{ “Soid”: “4c970548be67000000003859”} , “name”:“Jenny Gonzalez”, “zip” : 33101.0)
{ “_id” : { “$oid” : “4c970555be6700000000385a”} , “name” : “Srinivas Shastri”, “zip”:1089.0}
{“_id” :{“$oid” : “4c97a6555c760000000054d8”),“name”:“Don Joe”, “zip” : 10001.0)
{ “_id” : { “$oid” : “4c97a7ef5c760000000054da”}, “name”:“John Doe”, “zip”:94129.0}
{“_id”:{“$oid” : “4c97add25c760000000054db”} , “name”:“Lee Chang”, “zip” : 94129.0 , “streetAddress”:“37000 Graham Street”}
Java 程序的输出前面的命令行交互式 JavaScript shell 中看到的内容一致。
现在看看同样的例子是如何与PHP一起工作的。
MongoDB PHP driver
首先,从MongoDB github代码存储库下载PHP驱动程序,并将驱动程序配置为与本地PHP环境配合使用。
连接到本地MongoDB服务器并在prefs数据库中列出位置集合中的文档的示例PHP程序如下:
该程序简洁,但可以完成工作!接下来,你看看 Ruby 如何处理同样的任务。
MongoDB Ruby Driver
MongoDB有所有主流语言的驱动程序,Ruby也不例外。您可以从MongoDB github代码存储库获取驱动程序,但简单地依靠RubyGems来管理安装可能更容易。要准备从Ruby连接到MongoDB,请至少获取mongo和bson宝石。您可以按如下方式安装 mongo gem:
gem install mongo
bson gem 将自动安装。此外,还可能建议安装bson_ext。
示例描述了一个连接到 MongoDB 服务器的示例 Ruby 程序,并列出了 prefs 数据库中位置集合中的所有文档。
MongoDB Python Driver
安装 Python 驱动程序的最简单方法是运行 pymongo easy_install。安装完成后,您可以调用示例中的 Python 程序来获取 prefs 数据库中位置集合中所有文档的列表。
在此阶段,此示例已以至少五种不同的方式创建和运行。这是一个简单而有用的示例,说明了建立连接、获取数据库、集合以及该集合中的文档的直接相关概念。
初探 Thrift
Thrift是跨语言服务开发的框架。它由一个软件堆栈和一个代码生成引擎组成,可在多种语言之间顺利连接。Apache Cassandra 使用 Thrift 接口来提供一个抽象层来与列数据存储进行交互。您可以在incubator.apache.org/thrift/了解有关Apache Thrift的更多信息。
Cassandra Thrift 接口定义在 Apache Cassandra 发行版中名为 cassandra.thrift 的文件中可用,该文件位于接口目录中。Thrift 接口定义因 Cassandra 版本而异,因此请确保获得接口文件的正确版本。另外,请确保您拥有兼容版本的Thrift本身。
Thrift 可以为多种语言创建语言绑定。在Cassandra的情况下,你可以为Java,C++,C#,Python,PHP和Perl生成接口.生成所有Thrift接口的最简单命令是:
Thrift --gen interface/cassandra.thrift
此外,您可以将语言指定为节俭生成器程序的参数。
例如,要仅创建 Java Thrift 接口,请运行:
Thrift--Gen Java Interface/Cassandra.thrift
生成 Thrift 模块后,您可以在程序中使用它。假设您已成功生成 Python Thrift 接口和模块,您可以连接到 CarDataStore 密钥空间并查询数据,如示例所示。
from thrift import Thrift Wrox.com
from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated
from cassandra import Cassandra
from cassandra.ttypes import*
import time
import pprint
def main():
socket = TSocket.TSocket("localhost", 9160)
protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
transport = TTransport.TBufferedTransport(socket)
lient=Cassandra.client(protocol)
pp=pprint.Prettyprinter(indent=2)
keyspace="CarDataStore"
column_path = ColumnPath(column_family="Cars", column="make")
try:
transport.open() #Query for data
column_parent = ColumnParent(column_family="Cars")
slice_range = sliceRange(start="", finish="")
predicate = slicePredicate(slice_range=slice_range)
result =client.get_slice(keyspace, key,column_parent, predicate,ConsistencyLevel.ONE) pp.pprint(result)
except Thrift.TException, tx:
print 'Thrift: &s' % tx.message
finally:
transport.close()
if __name__ == '__main__':
main()
虽然,Thrift是一个非常有用的多语言界面,但有时你可能只是选择使用预先存在的语言API。其中一些 API 在经过测试和积极支持时提供了急需的可靠性和稳定性,同时它们连接的产品也在快速发展。其中许多在引擎盖下使用节俭。许多这样的库,特别是 Hector,用于 Java;Pycassa,for Python;Phpcassa,PHP 代表 Cassandra。
本文正在参加「技术专题19期 漫谈数据库技术」活动