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 因为它需要 复制自 命令。