我正在使用pyarango驱动程序(https://github.com/tariqdaouda/pyArango)来运行arangoDB,但是我不明白字段验证是如何工作的。我已经按照github的例子设置了一个集合的字段:
import pyArango.Collection as COL
import pyArango.Validator as VAL
from pyArango.theExceptions import ValidationError
import types
class String_val(VAL.Validator) :
def validate(self, value) :
if type(value) is not types.StringType :
raise ValidationError("Field value must be a string")
return True
class Humans(COL.Collection) :
_validation = {
'on_save' : True,
'on_set' : True,
'allow_foreign_fields' : True # allow fields that are not part of the schema
}
_fields = {
'name' : Field(validators = [VAL.NotNull(), String_val()]),
'anything' : Field(),
'species' : Field(validators = [VAL.NotNull(), VAL.Length(5, 15), String_val()])
}
因此,当我试图将一个文档添加到“Humans”集合中时,如果“name”字段不是字符串,就会出现错误。但似乎并不那么容易。
以下是我如何将文档添加到集合中:
myjson = json.loads(open('file.json').read())
collection_name = "Humans"
bindVars = {"doc": myjson, '@collection': collection_name}
aql = "For d in @doc INSERT d INTO @@collection LET newDoc = NEW RETURN newDoc"
queryResult = db.AQLQuery(aql, bindVars = bindVars, batchSize = 100)
因此,如果'name'不是字符串,我实际上不会得到任何错误,并被上传到集合中。
有人知道如何使用pyarango的内置验证来检查文档是否包含该集合的正确字段吗?
3条答案
按热度按时间nszi6y051#
我看不出你的验证器有什么问题,只是如果你使用AQL查询插入文档,pyArango在插入之前无法知道内容。
验证器仅在以下情况下对pyArango文档起作用:
这应该会触发例外状况,因为您已经定义:
jexiocij2#
ArangoDB作为文档存储本身并不强制执行模式,驱动程序也不强制执行。如果你需要模式验证,可以在驱动程序上或者在ArangoDB内部使用Foxx服务(通过the joi validation library)来完成。
一种可能的解决方案是在应用程序中的驱动程序上使用JSON Schema及其python implementation:
另一个使用JSON模式的真实的示例是swagger.io,它也用于记录ArangoDB REST API和ArangoDB Foxx服务。
imzjd6km3#
我还不知道我发布的代码有什么问题,但是现在看起来可以工作了。但是当我阅读json文件的时候,我不得不convert unicode to utf-8,否则它就不能识别字符串了。我知道ArangoDB本身并不强制执行scheme,但是我使用的是它有一个内置的验证。对于那些对使用python对arangoDB进行内置验证感兴趣的人,请访问pyarango github。