导入导出

官方 SDK 当前覆盖本地文件导入和按 ID 查询任务。数据源 Connector 的通用导入任务管理、任务列表与运行控制,以及导出任务的创建、重跑、文件列表和删除,尚未出现在 moi-python-sdkmoi-go-sdk 的公开客户端中。

因此,本页只给出源码已实现的调用。控制台中的完整导入与导出流程见数据载入数据导出

选择导入目标

数据

目标

推荐的 Python 调用

文档、图片、音视频等非结构化文件

Volume

SDKClient.import_local_file_to_volume

CSV 等需要形成结构化记录的文件

新建或已有 Table

暂存、预览后调用 SDKClient.import_local_file_to_table

需要过滤、解压、去重或显式 Table 配置的上传

Volume 或 Table 配置指定的目标

RawClient.upload_connector_file

不要用文件扩展名代替业务判断。例如 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=Falsedatabase_idtable_idconn_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 支持 appendoverwrite;空值与 append 相同。overwrite 会替换原有数据,调用前应确认目标 Table ID 和引用关系。

底层的冲突策略是:

Go 常量

行冲突处理

0

ConflictPolicyFail

导入失败

1

ConflictPolicySkip

跳过冲突行

2

ConflictPolicyReplace

替换冲突行

冲突策略与整表的 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_tableget_table_ref_list 再次确认目标。

导出能力边界

当前两个官方 SDK 未公开 Export Task 方法。不要用 Catalog 的文件下载或 Table CSV 下载模拟“导出任务”:下载只把内容返回给当前客户端,不包含外部目标 Connector、调度、重跑或任务治理。需要这些能力时,使用 AI Studio 的数据导出界面,并等待 SDK 发布相应公开方法。