- 列名是硬编码(写死的)
- pandas 和 MySQL 数据表的字段名和列名的对应关系也是硬编码
- MySQL 数据表的字段名的数据类型也是硬编码
综上,只需要维护两个数据关系即可:多维表的列名和 pandas.DataFrame 的字段名、多维表的数据类型和 MySQL 的数据类型。而后者基本上又是固定的,所以日常只需要维护前者即可。
本次要介绍的 API 叫列出字段,它的功能就是根据 app_token 和 table_id,获取数据表的所有字段。
同样,还是调出 API 调试台,左边依次查找云文档>多维表格>字段>点击列出字段,然后获取 access_token,填写多维表的路径参数,点击开始调试,便可以看到获取到的数据内容。
每一个列名,都包含“field_id”、“field_name”、“is_primary”、“property”、“type”和“ui_type”这 6 个参数。我们重点取“field_name”和“type”。“field_name”主要用于匹配通过查询数据接口获取的列名,“ui_type”就是前面介绍的飞书数据类型编号,这个编号用于映射 MySQL 的字段的数据类型。
将代码稍微整理一下,核心字符串,如 access_token、app_token 和 table_id 通过参数进行传递,并将接口返回的字段信息数据提取出来,示例如下:
这里的“tenant_access_token”也可以使用前面介绍的自动获取“access_token”的方法来获取该值,再通过参数传递给方法。打印结构参考如下:
给定一个数据类型映射关系,该映射表会固定下来,作为默认映射关系处理所有需要入库的飞书数据。
迭代内容主要包含两块:处理各个飞书数据类型编号的列返回的数据和构建建表 SQL。
3.2.1 迭代一:处理飞书各个数据类型的数据
- 如果是编号 1(文本),取字段值中的“text”文本;
- 如果是编号 2(数字)、3(单选)、7(复选框)、13(手机号)、1005(自动编号),则直接取字段值返回;
- 如果是编号 5(日期)、1001(创建日期)、1002(更新日期),取字段值加 8 小时,再转为 datetime 类型;
- 如果是编号 11(人员)、23(群组)、1003(创建人)、1004(修改人),遍历元素,取字段值中的“name”文本,然后用逗号连接起来;
- 如果是编号 15(链接),取字段值中的“link”文本;
- 如果是编号 17(附件),遍历元素,取字段值中的“url”文本;
- 如果是编号 18(单向关联)、21(双向关联),取字段值中的“link_record_ids”文本;
- 如果是编号 4(多选)、19(引用)、20(公式),取字段值转为字符串;
- 如果是编号 22(地理位置),取字段值中的“location”文本;
- 如果是按钮和流程,由于没有返回值,不做处理,忽略即可。
- 注意:入库如果是 json 类型必须使用进行格式化,否则写入数据库是会报错。
由于数据类型相对比较稳定,所以该逻辑作为固定的处理逻辑写入代码。如果临时需要调整,可以通过定制化处理,下一篇介绍。
3.2.2 迭代二:构建建表 SQL
接下来,根据“store_fields_info_df”和表名生成建表语句,参考如下:
3.2.3 迭代三:传递链接自动提取 app_token、table_id、view_id
由于上一篇的代码中没有涉及“view_id”,所以需要迭代相关的函数,目前相关的函数有两个:。修改的地方,主要有两个,一个是函数的参数传递,一个是接口的参数传递。前者直接加个参数,保证调用的时候位置对齐即可。后者则是修改下“payload”,修改后的内容参考如下:
将以上的代码组合到一起,并局部调整顺序,完整代码参考如下,几点说明:
- 循环获取飞书多维表每一页的数据的代码逻辑单独提取出来封装到新函数中;
- 函数不仅仅只是支持两个列表通过 DataFrame 合并在一起,也可以是一个 DataFrame 和一个列表
一点补充:目前该代码是追加的方式写入,会保留历史已经插入的数据,如果不要历史数据,保留最后一次插入的数据即可。可以通过者清空表数据再插入数据,或者在调用建表方法之前删表,再重建,再插入数据这两种方式。
- 清空表可以使用以下 SQL,通过调用函数执行 SQL;
- 删除表可以使用以下 SQL,通过调用函数执行 SQL。
- 当然,删表重建也可以直接将“if_exists”参数(是在函数中调用的方法中的一个参数)改为“replace”,它会在插入数据前,先删表重建,但是它无法保证新建的 MySQL 数据表各个字段的数据类型。
本文完成了飞书多维表数据写入 MySQL 数据库的通用版本代码的开发,经过对代码进行重构,把三组核心关系:飞书列名和数据类型、飞书列名和入库表单字段名、飞书数据类型和入库字段的数据类型解耦出来,使得代码通用性更强。
- 第一组关系借助飞书获取字段信息的接口解决;
- 第二组关系又用户使用时进行指定;
- 第三组关系比较固定,保持不变即可。
完整代码适用范围:
- 飞书多维表入库 MySQL 数据库,使用者需要拥有飞书应用权限、MySQL 数据库的 SELECT、INSERT、DELETE、CREATE、DROP 权限
- 写入规则是追加,如果只需保留最新版本数据,可以在插入数据前对数据进行清空,或者删表重建,参考最后的补充内容。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/haskellbc/46506.html