自有数据库使用指南
本文介绍如何把草料账号下的数据实时推送到你自己的 MySQL 数据库,适用于需要与企业其他系统做深度整合的场景。
功能介绍
由你提供主机、端口、数据库、用户名、密码,草料把你账号下的数据实时推送到这个数据库。推送过程会自动建表。
前置条件
开始前请确认:
- 数据库类型为 MySQL 5.7(MySQL 5.7 下载地址)
- 数据库 开放公网访问权限
- 表编码使用 utf8mb4
- 有防火墙时,已添加草料出口 IP 到白名单(见「常见问题 7」)
注意:
- 数据表是全量覆盖更新,不要在同一张表里混入你自己新增的数据
- 不要在数据库中新建与草料同名的数据表,会被识别为草料表并被全量覆盖
- 只创建了批量模板和表单、但没有填写数据的,不会自动建表
一、配置自有数据库
进入草料后台导航栏【数据管理】→【数据 API】→ 选择【自有数据库】→ 填入你的数据库主机、端口、账号等信息。

二、验证连接与数据推送
保存后建议按以下方式确认推送是否成功:
- 用数据库客户端连接上自己的数据库,在对应库中能看到
base_codeinfo、table_dXX等数据表 - 在草料表单里提交一条新记录,稍等片刻后查询
base_table_data,能看到新增记录 - 首次开通时历史数据同步一般需要 1~3 小时;超过这个时间仍不全,可联系在线客服排查
数据表说明
提示:自有数据库与官方数据库的表结构一致。如需查看完整的表关联模型与字段说明,也可以参考 官方数据库使用指南。
1. base_codeinfo 码的基本信息表
当账号下有二维码信息时会推送该表,包含活码、模板子码。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| code_id | int | 码的唯一标识 | 67654543 |
| 码名称 | string | 码名称 | 消火栓01 |
| 码类型 | string | 活码 / 模板子码 / 模板码 | 模板子码 |
| url | string | 二维码链接 | http://qr61.cn/o2eikt/q85Q8KL |
| tpl_code_id | int | 子码对应的批量模板 ID;非模板子码时与 code_id 相同 | 56335353 |
| 模板名称 | string | 子码对应的批量模板名称;非模板子码时与码名称相同 | 消火栓 |
| 目录 | string | 码所在的最后一级目录名称(不含上几级) | 消防设备 |
| 标签集 | string | 码的分组集合 | 消防类,设备 |
注:目录信息为码所在的最后一级目录,不会显示上级目录信息。
2. code_state 码的状态表
当二维码有关联状态时会推送该表(查看状态功能)。首次开通时不会推送开通之前的状态数据,如需这部分数据可联系在线客服手动同步。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| code_id | int | 码的唯一标识 | 67654543 |
| member_id | int | 成员唯一标识 | 2091263 |
| auth_id | int | 填表人唯一标识 | 12789054 |
| 更新时间 | datetime | 状态更新时间 | 2020-11-20 15:00:00 |
| 例:设备运行状态_720 | string | 状态组名称,尾部「_720」为系统自动生成的防重标识 | 正常 |
| ...... | string | 账号下所有状态组都会列在这里 | 异常 |
3. code_state_log 码的状态变更日志表
当二维码有关联状态时会推送该表,每次状态变更都会记录一条。首次开通时不会推送开通之前的变更数据。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| code_id | int | 码的唯一标识 | 67654543 |
| member_id | int | 成员唯一标识 | 2091263 |
| auth_id | int | 填表人唯一标识 | 12789054 |
| 更新时间 | datetime | 状态更新时间 | 2020-11-20 15:00:00 |
| 状态组 | string | 状态组名称 | 设备状态 |
| 状态值 | string | 本次状态值 | 正常 |
| 变更方式 | string | 变更状态的方式:记录(填表后更新)/ 编辑(手动) | 记录 |
| 来源 | string | 变更方式为「记录」时,对应的表单数据 record_id | 12220988 |
4. table_dXX 表单数据明细表
当账号下有表单数据提交时会推送该表。表单数据表名以 table_ 开头,d 后的数字为表单唯一编号,例如 table_d45 对应编号 D45 的表单(查看表单功能)。

| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| record_id | int | 表单数据唯一标识 | 12220988 |
| code_id | int | 码的唯一标识 | 67654543 |
| tpl_code_id | int | 模板子码对应的批量模板 ID;非模板子码时与 code_id 相同 | 54349863 |
| 码名称 | string | 码的名称 | 消火栓01 |
| tpl_id | int | 表单的唯一标识 | 346636 |
| 记录单名称 | string | 表单名称 | 消火栓检查 |
| 记录时间 | datetime | 添加表单数据的时间 | 2020-11-20 15:20:00 |
| 状态 | string | 记录当前状态 | 正常 / 删除 / 待审核 / 审核通过 / 审核不通过 |
| member_id | int | 协作成员唯一标识 | 2091263 |
| auth_id | int | 填表人唯一标识 | 12789054 |
| 记录编号 | string | 表单数据编号 | L1234 |
| 处理状态 | string | 记录的处理状态 | 待处理 / 已完成 / 无需处理 / 暂不标记状态 |
| 创建来源 | string | 包含手机扫码填写、在备注中填写(即后续动态中填写) | 手机扫码填写 |
| 来源编号 | string | 创建来源为「在备注中填写」时,为原记录的记录编号 | L1235 |
| 提交编号 | string | 草料后台自定义的提交编号 | 11 |
| 处理状态变更时间 | datetime | 处理状态变更时间 | 2020-11-20 15:20:00 |
| 例:设备名称 | string | 表单组件名称 | 检查项1 |
| ...... | string | 表单的所有组件名称会全部展开 |
表单组件推送说明:
- 数字组件:推送时不带单位
- 检查项组件:0 = 未填写,1 = √,2 = ×,3 = 不选;自定义「√/×」名称后,推送仍为 0/1/2/3
- 检查项组件中的备注描述和图片不推送
- 定位组件推送三个字段:定位中文信息、定位纬度、定位经度
- 描述组件推送,字段名为标题,值为描述内容
- 分组标题组件不推送
- 身份证组件拆分为:身份证信息、身份证号、姓名、性别、民族、出生日期、住址(其中「身份证信息」为空,其他为对应值)
- 多媒体组件(图片、文件、视频、音频)以链接方式推送,点击可查看
5. base_table_data 表单数据汇总表
所有表单记录的概要汇总表,含各表单共有字段(码名称、记录人、记录单名称等)。
应用场景:例如有「出」「入」两张表单,通过这张表可以一次取到所有出入数据,不用再做聚合。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| record_id | int | 表单数据唯一标识 | 12220988 |
| code_id | int | 码的唯一标识 | 67654543 |
| tpl_code_id | int | 批量模板 ID;非模板子码时与 code_id 相同 | 56335353 |
| tpl_id | int | 表单的唯一标识 | 346636 |
| 码名称 | string | 码名称 | 消火栓01 |
| 记录单名称 | string | 表单名称 | 消火栓巡检 |
| 记录时间 | datetime | 添加表单数据的时间 | 2020-11-20 12:01:02 |
| 记录人 | string | 填表人姓名 | 李四 |
| member_id | int | 成员唯一标识 | 2091263 |
| auth_id | int | 填表人唯一标识 | 12789054 |
| 状态 | string | 记录状态 | 正常 / 删除 / 待审核 / 审核通过 / 审核不通过 |
| 记录编号 | string | 记录编号 | L1234 |
6. template_codeinfo_XXX 批量模板子码信息表
当账号下有批量模板生成的子码时会推送该表,主要展示子码的可变内容(查看批量生码功能)。
命名为 template_codeinfo_ 开头,后面是批量模板的识别编号,历史上有两种编号规则:
- 方式一(旧):后缀为 dXX,d 后的数字即后台批量模板编号。例如模板编号 M312 对应表名
template_codeinfo_d312。

- 方式二(新):后缀为内部批量模板 ID。编辑批量模板时可从网址中获取 ID。

字段说明:
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| code_id | int | 码的唯一标识 | 67654543 |
| tpl_code_id | int | 批量模板的唯一标识 | 56335353 |
| 状态 | string | 批量子码是否删除 | 正常 |
| ... | string | 批量模板中的可变内容字段 |
7. record_review_data 后续动态数据表
当表单记录有后续动态或标记处理进度后会推送该表(查看后续动态功能)。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| review_id | int | 后续动态记录的唯一标识 | 67654543 |
| record_id | int | 关联的表单记录唯一标识 | 12220988 |
| 状态 | string | 后续动态记录是否删除 | 正常 / 删除 |
| 来源 | string | 后续动态记录的添加来源 | 手动填写 / 转发了记录 / 转发给了企业微信同事 / 变更处理状态 / 填写表单记录 / 发送通知 / 回复评论 |
| 文本内容 | string | 底部评论内容 / 处理进度记录 | 将记录更新为【已完成】/ @张三 /【图片】... |
| 关键内容 | string | 变更后的处理进度;若为填写表单,则为对应表单的 record_id | 已完成 / 12220988 |
| 附件 | string | 提交的图片、录音、手写签名等多媒体文件 | |
| 填写人 | string | 填表人姓名 | 张三 |
| 填写时间 | datetime | 后续动态记录添加时间 | 2020-11-20 15:20:00 |
8. base_task 计划基本信息表
当账号下创建计划并开始执行后会推送该表(计划管理功能)。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| task_id | int | 计划的唯一标识 | 33886 |
| 计划名称 | string | 计划名称 | 灭火器每月巡检 |
| 描述 | string | 计划描述 |
9. code_task_log 计划执行情况表
当账号下创建计划并开始执行后会推送该表。开通数据库时只推送当前周期及后续周期的数据,历史周期的完成情况不推送。
该表中没有码名称信息,可关联 base_codeinfo 或 template_XXX 来扩充码的信息。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| log_id | int | 当前计划任务的唯一标识 | 239168567 |
| task_id | int | 计划的唯一标识 | 33886 |
| 计划名称 | string | 计划名称 | 灭火器每月巡检 |
| code_id | int | 码的唯一标识 | 67654543 |
| 状态 | string | 当前周期执行状态 | 完成 / 未完成 / 即将超期 / 超期完成 / 超期未完成 |
| 开始时间 | datetime | 计划周期开始时间 | 2020-12-10 12:00:00 |
| 执行时间 | datetime | 状态变更时间 | 2020-12-10 13:00:00 |
| 截止时间 | datetime | 当前周期结束时间 | 2020-12-10 18:00:00 |
| 是否过滤 | string | 是否根据「无需检查」条件过滤 | 是 / 否 |
| 变更方式 | string | 变更方式 | 记录 |
| 来源 | int | 变更方式为「记录」时,对应的 record_id | 12220988 |
| 来源记录结果 | string | 变更方式为「记录」时,对应的表单记录结果 | 设备正常 |
10. code_tags 码的分组表
当使用分组功能并将码加入分组时会推送该表(查看分组管理功能)。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| code_id | int | 码的唯一标识 | 67654543 |
| 例:1 号楼灭火器 | int | 分组名称;该码在此分组下时值为 1 | 1 |
| 例:2 号楼灭火器 | int | 分组名称 | 1 |
| ...... | int | 账号下所有分组都会列在这里 |
11. base_members 成员信息表
当账号下添加了高级成员时会推送该表。当前仅同步高级成员信息,普通成员不推送(查看成员功能)。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| member_id | int | 协作成员的唯一标识 | 2091263 |
| 姓名 | string | 协作成员姓名 | 张三 |
| 手机号 | string | 协作成员手机号 | 135xxxx8934 |
12. base_auth_msg 填表人信息表
当有表单记录提交或状态更新时会推送该表,填表人即填写表单或变更状态的人员(查看填表人组件)。
- 未填写表单:只展示 auth_id
- 填写了表单但未使用填表人组件:只展示 auth_id,姓名为「微信用户 XXXX」
- 填写了表单并使用了姓名、手机号、工号、车牌号、身份证等组件:展示对应字段的数据
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| auth_id | int | 填表人的唯一标识 | 12789054 |
| 姓名 | string | 填表人姓名 | 李四 |
| 手机号 | string | 填表人手机号 | 135xxxx8934 |
| 工号 | string | 填表人工号 | D234 |
| 车牌号 | string | 填表人车牌 | 浙A.12342 |
| 身份证 | string | 填表人身份证 | 343xxxxxxxxxxxxx |
13. record_audit_data 记录审批工单表
当提交待审批记录或记录被审批后会推送该表(查看审批功能)。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| auth_id | int | 审批工单的唯一标识 | 9001 |
| record_id | int | 关联的记录 record_id | 1001 |
| 状态 | string | 工单审批状态 | 待审核 / 通过 / 不通过 |
| 审核标题 | string | 多级审核的标题;单级审批为空 | 财务审核 |
| 指定审核人 | string | 由填表人或前一级审核人指定的审核人;未指定时为空 | 张三 |
| 审核人 | string | 实际审核操作人 | 张三 |
| 审核时间 | datetime | 实际审核时间 | 2024-09-20 15:20:00 |
| 审核签名 | string | 实际审核人的签名图片链接;未签署时为空 | 签名图片 URL |
| 审核回复 | string | 实际审核人填写的回复;未填写时为空 | 提交的内容不符合要求 |
| 创建时间 | datetime | 工单创建时间 | 2024-09-20 10:20:00 |
事件推送规则
1. 活码
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 单码新建 | 推送 | base_codeinfo | base_codeinfo 新增一条 |
| 单码新建(有状态关联) | 推送 | base_codeinfo、code_state、code_state_log、table_d[x]、table_relation、base_table_data | 各表新增对应数据 |
| 单码修改 | 推送 | base_codeinfo | 修改对应数据,覆盖原值 |
| 单码删除 | 推送 | base_codeinfo | 删除对应数据 |
| 单码删除(有表单数据) | 推送 | base_codeinfo、table_d[x]、base_table_data | 删除对应数据 |
| 单码删除(有状态关联) | 推送 | base_codeinfo、code_state、table_d[x]、code_state_log、base_table_data | 删除对应数据 |
2. 批量模板
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 新建批量模板 | 不推送 | - | - |
| 新建批量模板(有状态关联) | 推送 | code_state、code_state_log | code_state 新增状态数据,code_state_log 新增初始化记录 |
| 修改批量模板标题 | 不推送 | - | - |
| 修改批量模板可变内容(无子码) | 不推送 | - | - |
| 修改批量模板可变内容(有子码) | 不推送 | - | - |
| 删除批量模板(有子码) | 推送 | base_codeinfo、template_codeinfo_[x] | 删除对应数据 |
| 删除批量模板(有子码 + 表单数据) | 推送 | base_codeinfo、template_codeinfo_[x]、base_table_data、table_d[x] | 删除对应数据 |
| 删除批量模板(有子码 + 关联状态) | 推送 | base_codeinfo、template_codeinfo_[x]、code_state、code_state_log | 删除对应数据 |
| 新建子码 | 推送 | base_codeinfo、template_codeinfo_[x] | 新增对应数据 |
| 新建子码(有状态关联) | 推送 | base_codeinfo、template_codeinfo_[x]、code_state、code_state_log | 新增对应数据 |
| 删除子码 | 推送 | base_codeinfo、template_codeinfo_[x] | 删除对应数据 |
| 删除子码(有状态关联) | 推送 | base_codeinfo、template_codeinfo_[x]、code_state、code_state_log | 删除对应数据 |
| 删除子码(有表单数据) | 推送 | base_codeinfo、template_codeinfo_[x]、base_table_data、table_d[x] | 删除对应数据 |
| 修改子码 | 推送 | base_codeinfo、template_codeinfo_[x] | 修改子码名称时变更 base_codeinfo;修改可变内容时变更 template_codeinfo_[x] |
3. 表单
注:以下事件都是在「有表单数据」时的情况,无表单数据时都不推送。
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 删除表单 | 推送 | table_d[x]、base_table_data | table_d[x] 删除所有记录(表结构保留),base_table_data 删除对应表单的记录 |
| 新增表单组件 | 推送 | table_d[x] | 新增组件字段,值为空 |
| 编辑表单组件 | 推送 | table_d[x] | 原组件字段保留(值为空),新增编辑后的字段 |
| 删除表单组件 | 推送 | table_d[x] | 原组件字段保留,值为空 |
| 修改表单名称 | 推送 | table_d[x]、table_relation | 对应表单名称同步修改 |
| 表单数据提交 | 推送 | base_table_data、table_d[x]、table_relation、base_auth_msg | 新增对应数据 |
| 表单数据待审核 | 推送 | base_table_data、table_d[x]、table_relation、base_auth_msg | 新增对应数据,比普通提交多一个审核状态字段 |
| 表单数据审核通过/拒绝 | 推送 | table_d[x]、base_table_data | 审核状态字段的值变更 |
| 表单数据修改 | 推送 | table_d[x]、base_table_data | 修改指定数据,覆盖原值 |
| 表单数据删除 | 推送 | table_d[x]、base_table_data | 删除指定数据(表结构保留) |
4. 状态
注:状态相关数据的同步会延迟 60 秒。
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 新增状态组 | 不推送 | - | - |
| 修改状态组名称 | 不推送 | - | - |
| 修改状态项名称 | 不推送 | - | - |
| 新增/删除状态项 | 不推送 | - | - |
| 删除状态组 | 不推送 | - | - |
| 二维码状态变更 | 推送 | table_d[x]、table_relation、base_table_data、code_state、code_state_log、base_auth_msg | code_state 有对应码则覆盖原数据,否则新增;base_auth_msg 存在则更新,否则新增 |
| 状态组修改后二维码状态变更 | 推送 | table_d[x]、table_relation、base_table_data、code_state、code_state_log | code_state 保留原状态组字段(值为空),新增修改后的状态组字段和值;code_state_log 新增一条变更记录 |
| 状态项修改后二维码状态变更 | 推送 | table_d[x]、table_relation、base_table_data、code_state、code_state_log、base_auth_msg | code_state 更新对应状态项的值;code_state_log 新增一条变更记录 |
5. 计划管理
注:计划新增/修改后,需要开始执行才会推送数据。
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 计划新增 | 不推送 | - | - |
| 计划开始 | 推送 | base_task、code_task_log | 新增对应数据 |
| 计划超时 | 推送 | code_task_log | 状态字段变更,执行时间字段自动填充为变更时间 |
| 计划删除 | 推送 | base_task、code_task_log | 删除对应数据 |
| 计划修改 | 推送 | base_task、code_task_log | 计划名称修改时更新 base_task;修改后的计划执行时更新 code_task_log |
6. 后续动态
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 后续动态功能开启 | 不推送 | - | - |
| 后续动态功能关闭 | 不推送 | - | - |
| 后续动态填写 | 推送 | record_review_data | 新增一条记录 |
| 后续动态【表单】填写 | 推送 | record_review_data、base_table_data、table_d[x]、table_relation、base_auth_msg | record_review_data 新增记录,同时走一遍表单数据提交逻辑,table_d[x] 中「来源编号」为被关联表单记录的记录编号 |
| 后续动态填写后的记录删除 | 推送 | record_review_data | 对应数据保留,状态字段变为「删除」 |
| 标记处理进度 | 推送 | record_review_data | 新增一条记录 |
7. 目录
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 目录重命名 | 不推送 | - | - |
| 二维码移动目录 | 推送 | base_codeinfo | 更新目录字段 |
| 目录删除 | 推送 | base_codeinfo、template_codeinfo_[x]、table_d[x]、base_table_data、code_state_log、code_state、code_task_log | 删除目录下所有码的数据(表结构保留) |
8. 成员
| 事件 | 是否推送 | 影响的数据表 | 数据表现 |
|---|---|---|---|
| 添加普通成员 | 不推送 | - | - |
| 添加高级成员 | 推送 | base_members | 新增成员数据 |
| 高级成员姓名修改 | 推送 | base_members | 更新成员数据 |
| 删除高级成员 | 不推送 | - | - |
常见问题
1. 自有数据库推送不过来
常见原因是数据表编码不对。需要把数据库编码换成 utf8mb4。
2. 二维码名称变更后,为什么表单数据表中的码名称没有更新?
表单中的二维码名称不会主动更新。如需获取最新码名称,可以左连接 base_codeinfo,关联字段为 code_id。
3. 表单组件名称修改后,数据表中出现了两个组件字段
这是正常现象。修改组件后,原组件字段会保留(值为空),新增修改后的字段。
4. 计划中设置了过滤异常状态值码,但数据表里还能查到
数据表会保留所有计划任务数据,通过「是否过滤」字段标识是否被过滤。另外,状态变更后要在下一个周期才会生效。
5. 开通后推送的数据不全
首次开通后,历史数据全量推送一般需要 1~3 小时,与账号数据量有关。如果隔一天仍不全,可联系在线客服排查。
6. 修改表单字段后,数据库中的字段为什么没更新?
修改表单本身不会触发数据库更新,只有在新增或修改表单数据时才会触发。可以提交一条新记录即可。
7. 服务器是白名单制,需要怎么处理?
可联系草料技术支持获取完整的出口 IP 列表,加入你服务器的防火墙白名单。Webhook 出口 IP 列表同样适用,可参考 Webhook 接入说明 - IP 白名单。
8. 为什么没有「动态数据表」?
动态数据是多类数据的汇总(含表单数据、状态变更数据),推送的数据表中没有独立的动态数据表。你可以按需查询 base_table_data、table_d[x] 或 code_state_log。
9. 图片组件中多个图片地址是拼在一起的,如何拆分成单张?
图片组件的数据格式为 urls_1,urls_2,...,图片数量不定。提供一套 SQL 函数用于拆分(把 照片_233233 换成你实际的字段名):
urls_1: SUBSTRING_INDEX(`照片_233233`, ',', 1)
urls_2: IF(LENGTH(`照片_233233`) - LENGTH(REPLACE(`照片_233233`, ',', '')) >= 1, SUBSTRING_INDEX(SUBSTRING_INDEX(`照片_233233`, ',', 2), ',', -1), '')
urls_3: IF(LENGTH(`照片_233233`) - LENGTH(REPLACE(`照片_233233`, ',', '')) >= 2, SUBSTRING_INDEX(SUBSTRING_INDEX(`照片_233233`, ',', 3), ',', -1), '')
urls_4: IF(LENGTH(`照片_233233`) - LENGTH(REPLACE(`照片_233233`, ',', '')) >= 3, SUBSTRING_INDEX(SUBSTRING_INDEX(`照片_233233`, ',', 4), ',', -1), '')
依此类推,按最大图片数量复制扩展即可。