background img reverse min

ArangoDB教程: Python 10分钟

对于Python开发人员,有多种驱动程序可供使用,您可以在应用程序中操作和管理ArangoDB服务器和数据库。

本教程是基于Tariq Daouda的 pyArango 驱动程序。您需要在主机上 安装 并启动ArangoDB,然后从Python包索引中安装pyArango。

 

$ pip install pyarango --user

一旦完成安装过程,您就可以开始在Python中开发ArangoDB应用程序。

使用说明

为了在应用程序中对ArangoDB服务器和数据库进行操作,您需要建立与服务器的连接,然后使用该连接在该服务器上打开或创建数据库。

PyArango通过命名方便的 连结 等级,来管理服务器连接。

>>> from pyArango.connection import *
>>> conn = Connection(username="root", password="root_passwd")

当该代码执行时,它会初始化 conn 变量上的服务器连接。默认情况下,pyArango会尝试建立与http://127.0.0.1:8529的连接。也就是说,它希望在端口8529上初始化到本地主机的远程连接。如果您在不同的服务器上托管ArangoDB或使用不同的端口,则需要在实例化 连接 类时设置这些选项。

创建和打开数据库

通过连接到ArangoDB服务器,您可以在服务器上打开或创建数据库并对其进行操作。服务器连接上的createDatabase() 方法会执行这两个操作,返回一个 Database 实例。

>>> db = conn.createDatabase(name="school")

school 数据库不存在时,pyArango会在服务器连接上创建它。当它存在时,它会尝试打开数据库。您也可以使用其名称作为服务器连接上的键来打开现有数据库。例如,

	
>>> db = conn["school"]
>>> db
ArangoDB database: school

创建集合

ArangoDB将文档和边缘分组到集合中。这与关系数据库中的表的概念类似,但是关键区别在于集合是非模式化的。

在pyArango中,您可以通过调用给定数据库上的 createCollection() 方法来创建一个集合。例如,在上面的部分,您创建了一个 school 数据库。您可能希望在该数据库上的学生集合。


>>> studentsCollection = db.createCollection(name="Students")
>>> db["Students"]
ArangoDB Collection name: Students, id: 202, type: document, status loaded

创建文档

建好数据库和集合之后,您可以开始添加数据。在关系数据库里,其中集合是表,文档是该表上的一行。然而,与行不同,这里的文档是非模式化的。您可以包含应用程序所需的任何值的排列。

例如,将一个student 添加到集合中:

>>> doc1 = studentsCollection.createDocument()
>>> doc1["name"] = "John Smith"
>>> doc1
ArangoDoc 'None': {'name': 'John Smith'}
>>> doc2 = studentsCollection.createDocument()
>>> doc2["firstname"] = "Emily"
>>> doc2["lastname"] = "Bronte"
>>> doc2
ArangoDoc 'None': {'firstname': 'Emily', 'lastname': 'Bronte'}

该文档显示其 _id 为“无”,因为您尚未将其保存到ArangoDB。这意味着该变量存在于您的Python代码中,但不存在于数据库中。 ArangoDB 通过将集合名称与 __key 值进行配对来构造 _id 值。除此之外,还可以处理作业,您只需要设置密钥并保存文档。

>>> doc1._key = "johnsmith"
>>> doc1.save()
>>> doc1
ArangoDoc 'Students/johnsmith': {'name': 'John Smith'}

不用手动输入和保存所有学生的数据,您可能希望通过循环输入数据,而不是单独调用。例如,

>>> students = [('Oscar', 'Wilde', 3.5), ('Thomas', 'Hobbes', 3.2), 
... ('Mark', 'Twain', 3.0), ('Kate', 'Chopin', 3.8), ('Fyodor', 'Dostoevsky', 3.1), 
... ('Jane', 'Austen',3.4), ('Mary', 'Wollstonecraft', 3.7), ('Percy', 'Shelley', 3.5), 
... ('William', 'Faulkner', 3.8), ('Charlotte', 'Bronte', 3.0)]
>>> for (first, last, gpa) in students:
...    doc = studentsCollection.createDocument()
...    doc['name'] = "%s %s" % (first, last)
...    doc['gpa'] = gpa 
...    doc['year'] = 2017
...    doc._key = ''.join([first, last]).lower() 
...    doc.save()

阅读文件

最终,您需要访问数据库中的文档。最简单的方法是使用 _key value。

例如,学校数据库现在有几个学生。想象一下这是一个更大的应用程序的一部分,每个学生都有更多的数据,你想查看某一个特定学生的GPA:

>>> def report_gpa(document):
...    print("Student: %s" % document['name'])
...    print("GPA:     %s" % document['gpa'])
>>> kate = studentsCollection['katechopin']
>>> report_gpa(kate)
Student: Kate Chopin
GPA:     3.8

更新文件

当您从ArangoDB读取文档到您的应用程序时,您将创建文档的本地副本。然后,您可以对文档进行操作,进行任何您喜欢的更改,然后使用 save() 方法将结果推送到数据库。

例如,每个学期每个班级的期末成绩,您需要更新学生在数据库中的成绩点平均数。鉴于这种情况经常发生,您可能需要创建一个特定的函数来处理更新:

>>> def update_gpa(key, new_gpa):
...    doc = studentsCollection[key]
...    doc['gpa'] = new_gpa
...    doc.save()

列出文档

有时,您可能希望对给定集合中的所有文档进行操作。使用 fetchAll() 方法,您可以检索和迭代文档列表。例如,学期末,您想知道哪些学生的平均成绩在3.5以上:


>>> def top_scores(col, gpa):
...    print("Top Soring Students:")
...    for student in col.fetchAll():
...       if student['gpa'] >= gpa:
...          print("- %s" % student['name'])
>>> top_scores(studentsCollection, 3.5)
Top Scoring Students:
- Mary Wollstonecraft 
- Kate Chopin
- Percy Shelly
- William Faulkner
- Oscar Wilde

删除文档

最终,您可能希望从数据库中删除文档。这可以通过 delete() 方法来实现。例如说,学生托马斯·霍布斯决定搬到另一个城市:

>>> tom = studentsCollection["thomashobbes"]
>>> tom.delete()
>>> studentsCollection["thomashobbes"]
KeyError: (
   'Unable to find document with _key: thomashobbes', {
      'code': 404,
	  'errorNum': 1202,
	  'errorMessage': 'document Students/thomashobbes not found',
	  'error': True
})

AQL 的使用方法

除了上面显示的Python方法之外,ArangoDB还提供了一种查询语言(称为AQL),用于检索和修改数据库上的文档。在pyArango中,您可以使用 AQLQuery() 方法执行这些查询。

例如,假设您要检索ArangoDB中所有文档的密钥:

>>> aql = "FOR x IN Students RETURN x._key"
>>> queryResult = db.AQLQuery(aql, rawResults=True, batchSize=100)
>>> for key in queryResult:
...    print(key)
marywollstonecraft
katechopin
percyshelley
fyodordostoevsky
marktwain
...

在上面的例子中,AQLQuery() 方法使用AQL查询作为参数,和另外两个选项:

  • rawResults 定义是否要查询查询返回的实际结果。
  • batchSize 当查询返回的结果超过给定值时,pyArango驱动程序将自动请求新的批次。

提醒:此查询不能保证文件的顺序。如果您需要特定顺序的结果,请向AQL查询添加一个排序子句。

使用AQL 插入文档

与上述文档创建类似,您也可以使用AQL将文档插入到ArangoDB中。这是通过使用 AQLQuery() 方法的 bindVars 选项的 INSERT 语句来完成的。

>>> doc = {'_key': 'denisdiderot', 'name': 'Denis Diderot', 'gpa': 3.7}
>>> bind = {"doc": doc}
>>> aql = "INSERT @doc INTO Students LET newDoc = NEW RETURN newDoc"
>>> queryResult = db.AQLQuery(aql, bindVars=bind)

使用 RETURN newDoc 将添加到数据库的新文档设置为返回值。意思是,您现在可以通过调用以下方式查看结果:

	
>>> queryResult[0]
ArangoDoc 'Students/denisdiderot': {'name': 'Denis Diderot', 'gpa': 3.7}

使用AQL 更新文档

如果数据库中已经存在文档,并且您想要修改该文档中的数据,则可以使用 UPDATE 语句。例如,您在CSV文件中收到学生的更新成绩点平均值。

首先,查看其中一位学生的GPA,以查看旧值:

>>> db["Students"]["katechopin"]
ArangoDoc 'Students/katechopin': {'name': 'Kate Chopin', 'gpa': 3.6}

然后通过循环文件更新每个学生的GPA:

>>> with open("grades.csv", "r') as f:
...    grades = f.read().split(',')
>>> for key,gpa in grades.items():
...    doc = {"gpa": float(gpa)}
...    bind = {"doc": doc, "key": key}
...    aql = "UPDATE @key WITH @doc IN Stdents LET pdated NEW RETRN updated"
...    db.AQLQuery(aql, bindVars=bind)

最后,再次查看学生的GPA。

>>> db["Students"]["katechopin"]
ArangoDoc 'Students/katechopin': {'name': 'Kate Chopin', 'gpa': 4.0}

虽然学生可以在不同学期间有相同的GPA,但在这种情况下,凯特的GPA提高了了几分。

使用AQL 删除文档

最后,您还可以使用 REMOVE 语句从ArangoDB中删除文档。例如,假设今年的学生已经完成学业并已毕业,您要将其从数据库中删除。您可以使用  属性来区分不同类别的学生,您可以使用 FILTER 子句来保留某些并删除其他学生。

>>> bind = {"@collection": "Students"}
>>> aql = """
... FOR x IN @@collection
...   FILTER x.year == 2017
...   REMOVE x IN @@collection
...     LET removed = OLD RETURN removed
... """
>>> queryResult = db.AQLQuery(aql, bindVars=bind)

FILTER 条件仅对与条件匹配的文档进行迭代。语句 REMOVE x IN 删除文档(匹配该条件)。@@collection(注意 @@ )定义集合名称的绑定变量。

AQLQuery() 给出的返回值会保留旧文档。所以,如果您直接查询,数据会直接显示。

>>> queryResult[0]
ArangoDoc 'Studnets/williamfaulkner': {'name': 'William Faulkner', 'gpa': 3.8, 'year': 2017}

如果您尝试从数据库中检索文档,ArangoDB会返回错误。

>>> db["Students"]["williamfaulkner"]
KeyError: ('Unable to find document with _key: williamfaulkner',
{
   'code': 404,
   'errorNum': 1202,
   'errorMessage': u'ducment /_api/document/Students/williamfaulkner not found',
   'error': True}
)

学习更多

现在您已经知道如何使用ArangoDB

  • 我们还有一个介绍 Tutorials 更多操作方法的教程
  • 查看 AQL 以了解关于我们查询语言的更多信息
  • 你想了解数据库的更多信息吗? 点击这里!
  • 阅读更多关于 集合 的内容
  • 发现关于 文档 的更多内容
  • 更多示例,您可以浏览 ArangoDB菜谱

This page has been translated from the original English version with great caution.
However, it might still contain mistakes. Please refer to the English version for binding information.

background img reverse min