我有一个Node扩展的类V.我使用提供的一组文档类型信息向Node添加实例。我想查询OrientDB数据库并从Node返回一些信息;要以格式化的方式显示它,我想要一个所有可能字段名称的列表(在我的应用程序中,当前有115个字段名称,其中只有一个是用作索引的属性)
要在pyorient中执行此操作,到目前为止我找到的唯一解决方案是(client是数据库句柄的名称):
count = client.query("SELECT COUNT(*) FROM Node")[0].COUNT
node_records = client.query("SELECT FROM Node LIMIT {0}".format(count))
node_key_list = set([])
for node in node_records:
node_key_list |= node.oRecordData.keys()
我通过反复试验得到了很多。它不是非常有效或优雅。当然必须有一种方法让数据库返回类或任何其他文档类型对象的所有可能字段的列表。有没有一种简单的方法可以通过pyorient或SQL命令来做到这一点?
答案 0 :(得分:1)
我尝试使用此数据集:
这是我班级的结构 TestClass
:
正如您从我的结构中看到的只有 name
, surname
和 timeStamp
已在 schema-full
模式下创建,而 nameSchemaLess1
和 nameSchemaLess1
已插入到数据库中 schema-less
模式。
完成此操作后,您可以在OrientDB Studio或控制台中创建 Javascript函数(如here所述),然后您可以从 pyOrient
中调用它使用 SQL
命令。
以下发布的函数会检索 TestClass
类的所有字段名称,而不会重复:
Javascript功能:
var g = orient.getGraph();
var fieldsList = [];
var query = g.command("sql", "SELECT FROM TestClass");
for (var x = 0; x < query.length; x++){
var fields = query[x].getRecord().fieldNames();
for (var y = 0; y < fields.length; y++) {
if (fieldsList == false){
fieldsList.push(fields[y]);
} else {
var fieldFound = false;
for (var z = 0; z < fieldsList.length; z++){
if (fields[y] == fieldsList[z]){
fieldFound = true;
break;
}
}
if (fieldFound != true){
fieldsList.push(fields[y]);
}
}
}
}
return fieldsList;
pyOrient代码:
import pyorient
db_name = 'TestDatabaseName'
print("Connecting to the server...")
client = pyorient.OrientDB("localhost", 2424)
session_id = client.connect("root", "root")
print("OK - sessionID: ", session_id, "\n")
if client.db_exists(db_name, pyorient.STORAGE_TYPE_PLOCAL):
client.db_open(db_name, "root", "root")
functionCall = client.command("SELECT myFunction() UNWIND myFunction")
for idx, val in enumerate(functionCall):
print("Field name: " + val.myFunction)
client.db_close()
<强>输出:强>
Connecting to the server...
OK - sessionID: 54
Field name: name
Field name: surname
Field name: timeStamp
Field name: out_testClassEdge
Field name: nameSchemaLess1
Field name: in_testClassEdge
Field name: nameSchemaLess2
正如您所看到的,已经检索到了所有字段名称,包括schema-full和schema-less。
希望有所帮助
答案 1 :(得分:1)
卢卡的回答奏效了。我修改它以适应我的口味/需求。在此处发布以增加Stack Exchange上OrientDB文档的数量。我把Luca的答案翻译成groovy。我还添加了一个参数来选择要获取字段的类,并在结果中删除UNWIND。感谢Luca帮助我学习。
带有1个参数(class_name)的函数getFieldList的Groovy代码:
g = orient.getGraph()
fieldList = [] as Set
ret = g.command("sql", "SELECT FROM " + class_name)
for (record in ret) {
fieldList.addAll(record.getRecord().fieldNames())
}
return fieldList
对于pyorient部分,删除数据库连接,如下所示:
node_keys = {}
ret = client.command("SELECT getFieldList({0})".format("'Node'"))
node_keys = ret[0].oRecordData['getFieldList']
班级名称的特别通知;在传递给client.command()的字符串中,参数必须用引号括起来。