Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
177 lines
6.0 KiB
Plaintext
177 lines
6.0 KiB
Plaintext
---
|
||
title: 通过 API 导入数据
|
||
description: 何时以及如何使用 Twenty 的 API 进行大规模数据导入。
|
||
---
|
||
|
||
## 概览
|
||
|
||
Twenty 提供 **GraphQL** 和 **REST API**,用于以编程方式导入数据。 当 CSV 导入不适合您的数据量,或您需要自动化、定期的导入时,请使用 API。
|
||
|
||
## 何时使用 API 导入
|
||
|
||
| 场景 | 推荐方法 |
|
||
| ------------------- | --------------- |
|
||
| 少于 10,000 条记录 | CSV 导入 |
|
||
| 10,000 - 50,000 条记录 | CSV 导入(拆分为多个文件) |
|
||
| **50,000+ 条记录** | **API 导入** |
|
||
| 一次性迁移 | 两者皆可(取决于数据量) |
|
||
| **定期导入** | **API 导入** |
|
||
| **实时同步** | **API 导入** |
|
||
| **与其他系统集成** | **API 导入** |
|
||
|
||
<Note>对于包含数十万条记录的数据集,API 比多次 CSV 导入显著更快且更可靠。</Note>
|
||
|
||
## API 速率限制
|
||
|
||
Twenty 实施速率限制以确保系统稳定性:
|
||
|
||
| 限制 | 值 |
|
||
| -------------- | ------------- |
|
||
| **每分钟请求数** | 100 |
|
||
| **每次批量调用的记录数** | 60 |
|
||
| **最大吞吐量** | ~6,000 条记录/分钟 |
|
||
|
||
<Warning>
|
||
**围绕这些限制规划您的导入。**
|
||
|
||
在最大吞吐量下,导入 100,000 条记录预计约需 17 分钟。 为错误处理和重试预留缓冲时间。
|
||
</Warning>
|
||
|
||
## 开始使用
|
||
|
||
### 步骤 1:获取您的 API 密钥
|
||
|
||
1. 前往 **设置 → 开发者**
|
||
2. 点击 **+ 创建 API 密钥**
|
||
3. 为您的密钥指定一个描述性名称
|
||
4. 立即复制该 API 密钥(不会再次显示)
|
||
5. 将其安全存储
|
||
|
||
<Warning>
|
||
**请保密您的 API 密钥。**
|
||
|
||
任何获得您 API 密钥的人都可以访问并修改您的工作区数据。 切勿将其提交到代码仓库或公开分享。
|
||
</Warning>
|
||
|
||
### 步骤 2:选择您的 API
|
||
|
||
Twenty 支持两种 API 类型:
|
||
|
||
| 接口 | 最适合 | 文档 |
|
||
| ----------- | ----------------------- | -------------------------------- |
|
||
| **GraphQL** | 灵活查询、获取关联数据、复杂操作 | [API 文档](/l/zh/developers/extend/api) |
|
||
| **REST** | 简单的 CRUD 操作、熟悉的 REST 模式 | [API 文档](/l/zh/developers/extend/api) |
|
||
|
||
两种 API 都支持:
|
||
|
||
* 创建、读取、更新和删除记录
|
||
* **批量操作** — 每次调用最多创建或更新 60 条记录
|
||
|
||
**对于导入,请使用批量操作**,以在速率限制内最大化吞吐量。
|
||
|
||
### 步骤 3:规划您的导入顺序
|
||
|
||
与 CSV 导入一样,对于关联关系,**顺序很重要**:
|
||
|
||
1. **公司** 优先(无依赖)
|
||
2. **人员** 其次(可关联到公司)
|
||
3. **商机** 第三(可关联到公司和人员)
|
||
4. **任务/笔记**(可关联到以上任一项)
|
||
5. **自定义对象**(按照其依赖关系)
|
||
|
||
## 最佳实践
|
||
|
||
### 批量处理请求
|
||
|
||
* 不要逐条发送记录
|
||
* 每次 API 调用最多分组处理 **60 条记录**
|
||
* 这可在速率限制内最大化吞吐量
|
||
|
||
### 处理速率限制
|
||
|
||
* 在请求之间实施延迟(持续导入时至少 600ms)
|
||
* 达到限制时使用指数退避
|
||
* 监控 429(请求过多)响应
|
||
|
||
### 先验证数据
|
||
|
||
* 在导入前清洗并验证数据
|
||
* 检查必填字段是否已填写
|
||
* 验证格式是否符合 Twenty 的要求 (参见 [字段映射](/l/zh/user-guide/data-migration/capabilities/field-mapping))
|
||
|
||
### 记录一切
|
||
|
||
* 记录每一条导入的记录(包括 ID)
|
||
* 记录错误及其完整上下文
|
||
* 这有助于调试问题并验证完成情况
|
||
|
||
### 先进行测试
|
||
|
||
* 使用小批量进行测试(10-20 条记录)
|
||
* 验证数据在 Twenty 中显示是否正确
|
||
* 然后执行完整导入
|
||
|
||
### 使用合并插入避免重复
|
||
|
||
GraphQL API 支持**批量合并插入** — 若记录已存在则更新,不存在则创建。 这可以在重新运行导入时防止重复。
|
||
|
||
## 查找对象和字段名称
|
||
|
||
查看可用的对象和字段:
|
||
|
||
1. 前往 **设置 → API 和 Webhooks**
|
||
2. 浏览 **Metadata API**
|
||
3. 查看所有标准和自定义对象及其字段
|
||
|
||
文档展示了所有标准和自定义对象、它们的字段以及预期的数据类型。
|
||
|
||
## 专业服务
|
||
|
||
对于复杂的 API 迁移,我们的合作伙伴可以提供帮助:
|
||
|
||
| 服务 | 包含内容 |
|
||
| ---------- | ---------- |
|
||
| **数据模型设计** | 设计最优的数据结构 |
|
||
| **迁移脚本** | 编写并运行导入脚本 |
|
||
| **数据转换** | 处理复杂的映射与清理 |
|
||
| **验证与 QA** | 验证迁移是否完成 |
|
||
|
||
**适用于:**
|
||
|
||
* 迁移 100,000+ 条记录
|
||
* 复杂的数据转换
|
||
* 紧迫的时间安排
|
||
* 缺乏开发人员资源的团队
|
||
|
||
请通过 [contact@twenty.com](mailto:contact@twenty.com) 与我们联系,或查看我们的 [实施服务](/l/zh/user-guide/getting-started/capabilities/implementation-services)。
|
||
|
||
## 常见问题
|
||
|
||
<AccordionGroup>
|
||
<Accordion title="GraphQL 与 REST 有何区别?">
|
||
GraphQL 允许您在一次查询中准确请求所需数据,并且更适合复杂操作。 REST 使用标准的 HTTP 方法(GET、POST、PUT、DELETE),如果您使用过传统 API,可能会更熟悉。
|
||
</Accordion>
|
||
|
||
<Accordion title="我可以通过 API 更新现有记录吗?">
|
||
是! 使用 update mutation(GraphQL)或带有记录 `id` 的 PUT/PATCH 请求(REST)。
|
||
</Accordion>
|
||
|
||
<Accordion title="如何处理重复数据?">
|
||
首先使用唯一标识符(email、domain)查询现有记录。 存在则更新,不存在则创建。
|
||
</Accordion>
|
||
|
||
<Accordion title="我可以通过 API 删除记录吗?">
|
||
可以,使用 delete mutation(GraphQL)或 DELETE 请求(REST)。
|
||
</Accordion>
|
||
|
||
<Accordion title="是否提供 Python 或 Node.js 的 SDK?">
|
||
目前没有,但这两种 API 可与任何语言中的任意 HTTP 客户端配合使用。
|
||
</Accordion>
|
||
</AccordionGroup>
|
||
|
||
## API 文档
|
||
|
||
有关完整的实现细节、代码示例和架构参考:
|
||
|
||
* [API 文档](/l/zh/developers/extend/api)
|