dify升级中PostgreSQL数据库字段更新处理

笔记哥 / 04-03 / 0点赞 / 0评论 / 883阅读
# 一、概述 dify运行在容器中,PostgreSQL用的是阿里云,已经运行了很长一段时间。某些表的数据量很大,比如workflowruns表,就有100GB。这个主要是,详细记录了工作流的执行情况,包括执行时间、状态、结果等信息。 版本比较老,0.14.2,需要升级到0.15.3。 升级之前,除了对数据库做备份之外,还需要知道升级过程中,哪些表需要做更新处理。因为某些大表如果要添加字段,索引等操作,非常耗费时间,长达3个小时以上。 为了缩短升级过程,需要对数据库的某些大表,提前进行清理,一些不重要的数据,保留1个月即可。 # 二、代码分析 访问github官网,![](https://cdn.res.knowhub.vip/c/2504/03/eda8df80?ixCAaHR0cHM6Ly9naXRodWIuY29tL2xhbmdnZW5pdXMvZGlmeQM%3d) 下载releases对应的版本的代码,0.14.2,0.15.3 得到文件,dify-0.14.2.zip,dify-0.15.3.zip 首先解压文件dify-0.14.2.zip 进入文件夹,dify-0.14.2\api\models api是基于python flask框架开发的, models里面的python文件,都是数据库表结构文件。 然后解压文件dify-0.15.3.zip,对比2个model文件,发现workflowruns表,确实是有更新的 0.14.2如下: total\_tokens = db.Column(db.Integer, nullable=False, server\_default=db.text("0")) 0.15.3 如下: total\_tokens: Mapped[int] = mapped\_column(sa.BigInteger, server\_default=sa.text("0")) 直接对比python文件,不够直观,涉及的文件比较多。就算看出来差异了,也不能直接看到具体的表字段是怎么变化的。 接下来,使用sql文件分析,会更加直观一些。 # 三、sql文件分析 **演示环境,我们弄2台服务器,分别运行0.14.2,0.15.3。不需要任何数据库,直接空数据运行都没问题,主要是为了分析表结构。** ## 0.14.2 进入0.14.2版本的容器,找到dify\_db\_1,进入docker ```csharp docker exec -it dify_db_1 /bin/bash ``` 导出dify表结构 ```csharp pg_dump -h localhost -p 5432 -U postgres -d dify -s -f dify-0.14.2.sql ``` 将文件拷贝出来 ```csharp docker cp dify_db_1:/dify-0.14.2.sql /tmp/dify-0.14.2.sql ``` ## 0.15.3 进入0.15.3版本的容器,找到dify\_db\_1,进入docker ```csharp docker exec -it dify_db_1 /bin/bash ``` 导出dify表结构 ```csharp pg_dump -h localhost -p 5432 -U postgres -d dify -s -f dify-0.15.3.sql ``` 将文件拷贝出来 ```csharp docker cp dify_db_1:/dify-0.15.3.sql /tmp/dify-0.15.3.sql ``` ## 对比差异 使用VsCode编辑器对比2个文件,dify-0.14.2.sql,dify-0.15.3.sql 差异如下: 左边是0.14.2,右边是0.15.3 新增表child\_chunks ![](https://cdn.res.knowhub.vip/c/2504/03/743ee9fe.png?G1cAAMT0bJzotVrBNvqh%2f4lHQjNgkUZQKWG93nv3aUTf7wLR%2bMw%2blp8Pv%2bljOXFSRgUJxKAIAYkzqhiggUuGlmKQuKcD) 新增表data\_source\_oauth\_bindings ![](https://cdn.res.knowhub.vip/c/2504/03/c50d0bec.png?G1YAAMTW3DgpD0JG22gDdWfqnTUDElkElRLW6%2fn%2ftS%2bi9wuBaL5H6zP2h7%2b0PoO4KMNBAjEokkfhA26m4CR%2bWnWvNa8R) 比较关心的表workflowruns,确实发生了变化。 0.14.2版本total\_tokens字段是int类型 0.15.3版本total\_tokens字段是bigint类型 ![](https://cdn.res.knowhub.vip/c/2504/03/097997e0.png?G1QAAMTsdJzIJwml26hD2jvFHc2ARBZBpYT1es9Z%2byb6fheIxWe0Pn1%2f%2bEvr04nVGBUkkARDsFDODMlWrpAqtBSLazg%3d) child\_chunks表添加一个主键约束,确保 id 列中的值是唯一的。 ![](https://cdn.res.knowhub.vip/c/2504/03/df567765.png?G1cAAMTydJz4u%2fcquo06fJsoEpoBizSCSgnr9Z6z9i3y%2fa5Qi89offr%2b8JvWpwuTERWi0AxDCEi8SBjAoEApBpQa13A%3d) dataset\_auto\_disable\_logs表添加一个主键约束,确保 id 列中的值是唯一的。 ![](https://cdn.res.knowhub.vip/c/2504/03/bc889699.png?G1cAAMR0rnGCXh953EYcqgkCCTQDFmkElRLW6z1n7Zvo%2b10gFp%2fR%2bvT94TetTydWY1SQQC4YQoByYlbkKoGNkbKUonENBw%3d%3d) child\_chunks表添加组合索引child\_chunk\_dataset\_id\_idx ![](https://cdn.res.knowhub.vip/c/2504/03/4a9be467.png?G1cAAMTmtHFS4MR3G%2b1Am1g10WbAIo2gUsJ6vffu04i%2b38BQ%2f8w%2blp0Pv%2bljGUlQ4coERmSFCxwkCVhTDk5QkGMtCr%2bnAQ%3d%3d) dataset\_auto\_disable\_logs表添加索引dataset\_auto\_disable\_log\_created\_atx,dataset\_auto\_disable\_log\_dataset\_idx,dataset\_auto\_disable\_log\_tenant\_idx ![](https://cdn.res.knowhub.vip/c/2504/03/77b65ad4.png?G1YAAMTW3Dgp8EBZ22gDdWfqnTYDElkElRLW6917rpvo%2bwMMy0%2bvbcT68JfaRpCoCV9MYDgbkmeVQ2COYkngpwBa8uwB) 知道以上这些差异之后,就可以对生产PostgreSQL数据库做进一步处理了