使用Python操作ArangoDB
参考:(1)Python连接操作图数据库arangodb教程_测试小白白的学习之路的博客-优快云博客_arangodb图数据库
1. 安装pyarango库
pip install pyarango
2. 导入pyarango
from pyArango.connection import *
3. 创建连接
conn_URL = 'http://localhost:8529'
#安装arangodb完成后,在浏览器输入localhost:8529就可以进入到arangodb的前端页面,arangodb一般的默认端口都是8529
username = 'root'
passwd = ''
conn = Connection(arangoURL=conn_URL, username=username, password=passwd)
print('conn: %s' % conn) #感兴趣的小伙伴可以查看一下这个连接显示的到底是个啥
4. 创建数据库
database_name = 'my_db'
#判断是否有该数据库,如果没有就创建该数据库,如果有就直接连接
if not conn.hasDatabase(database_name):
conn.createDatabase(name=database_name)
db = conn[database_name]
print('db: %s' % db)
5. 创建集合
我理解的arangodb数据库的collection就是表,分为点表(document)和边表(edge),但本次教程中默认创建的是document。
collection_name = 'users'
if not db.hasCollection(collection_name):
db.createCollection(name=collection_name)
collection = db[collection_name]
print('collection: %s' % collection)
6. 插入文档数据
插入数据有两种方法:
一种是用.save()
方法添加,
另一种使用aql
语句进行添加
.save()
方法插入文档数据:
利用for循环批量插入
print('插入之前的数据量: %s' % collection.count())
for i in range(0,10):
user = {
'name' : 'user_' + str(i),
'age' : 20 + i,
'address' : {
'home' : 'home address',
'office' : 'office address'
}
}
collection.createDocument(user).save()
print('插入之后的数据量: %s' % collection.count())
aql
语句插入数据
rowlist = {
'name': 'user_',
'age' : 20,
'address': {
'home': 'home address',
'office' : 'office address'
}
}
bind = {"rowlist": rowlist, "@collection":collection_name}
aql = 'INSERT @rowlist into @@collection'
result = db.AQLQuery(aql, bindVars=bind)
bindVars表示的是绑定参数。
绑定参数的语法是@+参数名称
存在一种特殊类型的绑定参数用于注入集合名称。这种类型的绑定参数有一个以附加@符号为前缀的名称(因此在查询中使用绑定参数时,必须使用两个@符号)。
“@collection”:collection_name表示的是插入到变量collection_name中存入的集合
笔者目前还没有找到像.save()方法批量插入不重复的方法,对aql也没那么精通。
7. 查询文档
(1)分页查询
query = collection.fetchAll(skip=5, limit=2)
for doc in query:
print(doc)
(2)按条件查询
query = collection.fetchByExample({'name':'user_5'}, batchSize=10, count=True)
for doc in query:
print(doc)
(3)使用aql查询
print('query by AQL ... 使用aql查询文档')
aql = "FOR user IN users FILTER user.name == @name || user.age < 25 LIMIT 5 RETURN user"
bindVars = {'name' : 'user_0'}
query = db.AQLQuery(aql, rawResults=True ,batchSize=1, bindVars=bindVars)
doc = []
for i in query:
doc.append(i)
print(i)
print('total ' + str(len(doc)) + ' elements')
查询后会显示结果,因为之前测试的时候需要看查询结果有多少条,找了关于db.AQLQuery
的资料,但是没有找到,我就想了一个方法,把结果方法doc的列表中,然后统计列表中的元素个数,就是我想要的查询的结果数。目前看还是可以的,如果有更好的方法欢迎告诉我哈。
(4)删除文档
删除文档有两种方法,这里只是删除文档,没有把集合删除,相当于清空集合。
一种是用.delete
方法删除
另一种是通过aql
删除文档
.delete
方法
#为了增加可读性,在删除前后都添加打印document条数
print('collection count before delete: %s' % collection.count())
query = collection.fetchAll()
for doc in query:
doc.delete()
print('collection count after delete: %s' % collection.count())
这个是逐条删除document,所以时间可能会有点长,但也没有长到无法接收的地步,删除的时间还是和数据量有关。
aql
方法
bind = {"@collection": collection_name}
aql = 'for i in @@collection remove i in @@collection'
result = db.AQLQuery(aql, bindVars=bind)
(5)删除集合
collection.delete()