11. 数据导入

CubicWeb 旨在轻松处理大量数据,并提供实用程序使导入变得简单。

主要入口点是 cubicweb.dataimport.importer 它定义了 ExtEntitiesImporter 负责从窗体中的外部源导入数据的类 ExtEntity 物体。一个 ExtEntity 是要在CubicWeb实例中导入的实体的过渡表示;构建此表示通常是特定于域的,例如依赖于数据源类型(RDF、CSV等),因此是最终用户的责任。

与进口商一道, 商店 必须选择,它负责将数据插入数据库。有不同种类的 stores, 允许在 CubicWeb API和不同的速度/安全权衡。那些保存所有 CubicWeb 钩子和安全性将变慢,但插入过程中可能出现的错误(错误的数据类型、完整性错误等)将得到处理。

11.1. 例子

考虑下面的架构片段。

class Person(EntityType):
    name = String(required=True)

class knows(RelationDefinition):
    subject = 'Person'
    object = 'Person'

以及一些数据 people.csv 文件::

# uri,name,knows
http://www.example.org/alice,Alice,
http://www.example.org/bob,Bob,http://www.example.org/alice

以下代码(使用shell上下文)定义函数 extentities_from_csv 阅读 Person 来自csv文件的外部实体并调用 ExtEntitiesImporter 在CubicWeb实例中插入相应的实体和关系。

from cubicweb.dataimport import ucsvreader, RQLObjectStore
from cubicweb.dataimport.importer import ExtEntity, ExtEntitiesImporter

def extentities_from_csv(fpath):
    """Yield Person ExtEntities read from `fpath` CSV file."""
    with open(fpath) as f:
        for uri, name, knows in ucsvreader(f, skipfirst=True, skip_empty=False):
            yield ExtEntity('Person', uri,
                            {'name': set([name]), 'knows': set([knows])})

extenties = extentities_from_csv('people.csv')
store = RQLObjectStore(cnx)
importer = ExtEntitiesImporter(schema, store)
importer.import_entities(extenties)
commit()
rset = cnx.execute('String N WHERE X name N, X knows Y, Y name "Alice"')
assert rset[0][0] == u'Bob', rset

11.2. 进口商API

11.2.1. 商店

11.3. SQLGenObjectStore

这家商店依靠 复制自 /执行许多SQL命令,直接使用SQL命令推送数据,而不是使用整体 CubicWeb 应用程序编程接口。现在, 它只适用于Postgressql 因为它需要 复制自 命令。