ArangoDB教程: Python 10分钟
$ 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} )
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.