使用说明
为了在应用程序中对ArangoDB服务器和数据库进行操作,您需要建立与服务器的连接,然后使用该连接在该服务器上打开或创建数据库。
PyArango通过命名方便的 连结
等级,来管理服务器连接。
1
2
|
>>>
from
pyArango
.
connection
import
*
>>>
conn
=
Connection
(
username
=
"root"
,
password
=
"root_passwd"
)
|
当该代码执行时,它会初始化 conn
变量上的服务器连接。默认情况下,pyArango会尝试建立与http://127.0.0.1:8529的连接。也就是说,它希望在端口8529上初始化到本地主机的远程连接。如果您在不同的服务器上托管ArangoDB或使用不同的端口,则需要在实例化 连接
类时设置这些选项。
创建和打开数据库
通过连接到ArangoDB服务器,您可以在服务器上打开或创建数据库并对其进行操作。服务器连接上的createDatabase()
方法会执行这两个操作,返回一个 Database
实例。
1
|
>>>
db
=
conn
.
createDatabase
(
name
=
"school"
)
|
当school
数据库不存在时,pyArango会在服务器连接上创建它。当它存在时,它会尝试打开数据库。您也可以使用其名称作为服务器连接上的键来打开现有数据库。例如,
1
2
3
|
>>>
db
=
conn
[
"school"
]
>>>
db
ArangoDB
database
:
school
|
创建集合
ArangoDB将文档和边缘分组到集合中。这与关系数据库中的表的概念类似,但是关键区别在于集合是非模式化的。
在pyArango中,您可以通过调用给定数据库上的 createCollection()
方法来创建一个集合。例如,在上面的部分,您创建了一个 school
数据库。您可能希望在该数据库上的学生集合。
1
2
3
|
>>>
studentsCollection
=
db
.
createCollection
(
name
=
"Students"
)
>>>
db
[
"Students"
]
ArangoDB
Collection
name
:
Students
,
id
:
202
,
type
:
document
,
status
loaded
|
创建文档
建好数据库和集合之后,您可以开始添加数据。在关系数据库里,其中集合是表,文档是该表上的一行。然而,与行不同,这里的文档是非模式化的。您可以包含应用程序所需的任何值的排列。
例如,将一个student 添加到集合中:
1
2
3
4
5
6
7
8
9
|
>>>
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
值。除此之外,还可以处理作业,您只需要设置密钥并保存文档。
1
2
3
4
|
>>>
doc1
.
_key
=
"johnsmith"
>>>
doc1
.
save
(
)
>>>
doc1
ArangoDoc
'Students/johnsmith'
:
{
'name'
:
'John Smith'
}
|
不用手动输入和保存所有学生的数据,您可能希望通过循环输入数据,而不是单独调用。例如,
1
2
3
4
5
6
7
8
9
10
11
|
>>>
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:
1
2
3
4
5
6
7
|
>>>
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()
方法将结果推送到数据库。
例如,每个学期每个班级的期末成绩,您需要更新学生在数据库中的成绩点平均数。鉴于这种情况经常发生,您可能需要创建一个特定的函数来处理更新:
1
2
3
4
|
>>>
def
update_gpa
(
key
,
new_gpa
)
:
.
.
.
doc
=
studentsCollection
[
key
]
.
.
.
doc
[
'gpa'
]
=
new
_gpa
.
.
.
doc
.
save
(
)
|
列出文档
有时,您可能希望对给定集合中的所有文档进行操作。使用 fetchAll()
方法,您可以检索和迭代文档列表。例如,学期末,您想知道哪些学生的平均成绩在3.5以上:
1
2
3
4
5
6
7
8
9
10
11
12
|
>>>
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()
方法来实现。例如说,学生托马斯·霍布斯决定搬到另一个城市:
1
2
3
4
5
6
7
8
9
10
|
>>>
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中所有文档的密钥:
1
2
3
4
5
6
7
8
9
10
|
>>>
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
语句来完成的。
1
2
3
4
|
>>>
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
将添加到数据库的新文档设置为返回值。意思是,您现在可以通过调用以下方式查看结果:
1
2
|
>>>
queryResult
[
0
]
ArangoDoc
'Students/denisdiderot'
:
{
'name'
:
'Denis Diderot'
,
'gpa'
:
3.7
}
|
使用AQL 更新文档
如果数据库中已经存在文档,并且您想要修改该文档中的数据,则可以使用 UPDATE
语句。例如,您在CSV文件中收到学生的更新成绩点平均值。
首先,查看其中一位学生的GPA,以查看旧值:
1
2
|
>>>
db
[
"Students"
]
[
"katechopin"
]
ArangoDoc
'Students/katechopin'
:
{
'name'
:
'Kate Chopin'
,
'gpa'
:
3.6
}
|
然后通过循环文件更新每个学生的GPA:
1
2
3
4
5
6
7
|
>>>
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。
1
2
|
>>>
db
[
"Students"
]
[
"katechopin"
]
ArangoDoc
'Students/katechopin'
:
{
'name'
:
'Kate Chopin'
,
'gpa'
:
4.0
}
|
虽然学生可以在不同学期间有相同的GPA,但在这种情况下,凯特的GPA提高了了几分。
使用AQL 删除文档
最后,您还可以使用 REMOVE
语句从ArangoDB中删除文档。例如,假设今年的学生已经完成学业并已毕业,您要将其从数据库中删除。您可以使用 年
属性来区分不同类别的学生,您可以使用 FILTER
子句来保留某些并删除其他学生。
1
2
3
4
5
6
7
8
|
>>>
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()
给出的返回值会保留旧文档。所以,如果您直接查询,数据会直接显示。
1
2
|
>>>
queryResult
[
0
]
ArangoDoc
'Studnets/williamfaulkner'
:
{
'name'
:
'William Faulkner'
,
'gpa'
:
3.8
,
'year'
:
2017
}
|
如果您尝试从数据库中检索文档,ArangoDB会返回错误。
1
2
3
4
5
6
7
8
|
>>>
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
}
)
|