导入导出¶
官方 SDK 当前覆盖本地文件导入和按 ID 查询任务。数据源 Connector 的通用导入任务管理、任务列表与运行控制,以及导出任务的创建、重跑、文件列表和删除,尚未出现在 moi-python-sdk 或 moi-go-sdk 的公开客户端中。
因此,本页只给出源码已实现的调用。控制台中的完整导入与导出流程见数据载入和数据导出。
选择导入目标¶
数据 |
目标 |
推荐的 Python 调用 |
|---|---|---|
文档、图片、音视频等非结构化文件 |
Volume |
|
CSV 等需要形成结构化记录的文件 |
新建或已有 Table |
暂存、预览后调用 |
需要过滤、解压、去重或显式 Table 配置的上传 |
Volume 或 Table 配置指定的目标 |
|
不要用文件扩展名代替业务判断。例如 CSV 可以作为原始文件保存在 Volume,也可以解析为 Table;两种结果和后续处理方式不同。
将本地文件导入已有 Table¶
第一步把文件上传到 Connector 临时存储并预览:
from moi import SDKClient
sdk = SDKClient(client)
upload = client.upload_local_file_from_path(
"/data/orders.csv",
[{"filename": "orders.csv", "path": "/"}],
)
conn_file_id = upload["conn_file_ids"][0]
preview = client.preview_connector_file({"conn_file_id": conn_file_id})
确认预览中的表头、列顺序和类型后,再提交导入。写入已有 Table 时需要 new_table=False、database_id、table_id、conn_file_ids,以及按需提供 existed_table 列映射:
result = sdk.import_local_file_to_table(
{
"new_table": False,
"database_id": 201,
"table_id": 301,
"conn_file_ids": [conn_file_id],
"existed_table": [],
"existed_table_opts": {"method": "append"},
}
)
existed_table_opts.method 支持 append 和 overwrite;空值与 append 相同。overwrite 会替换原有数据,调用前应确认目标 Table ID 和引用关系。
底层的冲突策略是:
值 |
Go 常量 |
行冲突处理 |
|---|---|---|
|
|
导入失败 |
|
|
跳过冲突行 |
|
|
替换冲突行 |
冲突策略与整表的 append / overwrite 是两个维度,不要互相替代。
新建 Table¶
将 new_table 设为 True,并在 create_table 中提供名称、说明和列定义。列定义可来自预览结果,但仍应由应用校验:
result = sdk.import_local_file_to_table(
{
"new_table": True,
"database_id": 201,
"conn_file_ids": [conn_file_id],
"create_table": {
"name": "orders",
"description": "Imported orders",
"tableColumn": [
{
"number": 1,
"columnName": "id",
"dataType": "int",
"isKey": True,
"col_num_in_file": 1,
}
],
},
"isColumnName": True,
"columnNameRow": 1,
"rowStart": 2,
}
)
字段名和大小写沿用 SDK 公共类型。目标服务支持的数据类型应从实际预览和服务契约确认。
用 Go 提交高级文件导入¶
Go 的 UploadConnectorFile 接受 UploadFileRequest,可以直接上传文件,也可以复用已经暂存的 ConnFileIDs:
resp, err := client.UploadConnectorFile(ctx, &sdk.UploadFileRequest{
VolumeID: "vol-1",
Meta: []sdk.FileMeta{
{Filename: "orders.csv", Path: "/"},
},
TableConfig: &sdk.TableConfig{
NewTable: false,
DatabaseID: 201,
TableID: 301,
ConnFileIDs: []string{"conn-file-id"},
ExistedTableOpts: sdk.ExistedTableOptions{
Method: sdk.ExistedTableOptionAppend,
},
},
})
请求必须提供 VolumeID,并且至少直接上传一个文件,或在 TableConfig.ConnFileIDs 中引用已上传文件。响应包含 TaskId 以及各文件的结果。
查询任务¶
Python 使用 get_task({"task_id": ...}),Go 使用 GetTask(ctx, &TaskInfoRequest{TaskID: ...}):
task = client.get_task({"task_id": result["task_id"]})
print(task["status"])
SDK 只提供单次读取,不提供通用等待器。调用方轮询时应设置总超时和带抖动的退避间隔,并把服务端返回的状态当作准确信息;不要在客户端硬编码文档未确认的状态枚举。任务进入终态后,还要读取 Table 或 Volume 验证实际结果。
清理与重试¶
保存
task_id、目标 ID、输入文件校验信息和请求标识,便于定位重复或失败请求。重试前先读取任务详情;不要因一次网络超时直接重复提交覆盖型导入。
暂存文件不再使用后,调用
delete_connector_file删除。导入已有 Table 前,可用
get_table和get_table_ref_list再次确认目标。
导出能力边界¶
当前两个官方 SDK 未公开 Export Task 方法。不要用 Catalog 的文件下载或 Table CSV 下载模拟“导出任务”:下载只把内容返回给当前客户端,不包含外部目标 Connector、调度、重跑或任务治理。需要这些能力时,使用 AI Studio 的数据导出界面,并等待 SDK 发布相应公开方法。