我有一个基于python的应用程序,它包含大量模块并与两个数据库交互:

  • 元数据(需要在某些情况下更新)

  • 客户端数据此应用程序可以在没有Internet访问的环境中手动部署 .

What are the best practices and things to consider when implementing update mechanism for this kind of system? 几乎所有的信息都是关于打包和分发阶段 - 签名等等,但我更关注更新过程本身 .

我考虑过使用pip包版本处理代码更新,并根据其版本通过脚本处理元数据数据库 . 这提出了一些新问题:

  • 机制应如何处理具有某些副作用或先决条件的代码更新?例如,用户配置文件的模式已更改 - 因此先前的配置应转换为新配置(我猜它应该对用户透明) . 显然,只有在从版本X更新到Y而不是在干净安装(可以分配默认值的位置)时才会执行此操作 .

应该如何处理,特别是如果我们有版本差距? - 例如客户端版本为1,最新版本为4,转换需求为2到3.它应该是一个累积更新,将保存所有更新(1-> 2-> 3-> 4)并处理所有这些与脚本?或者每个更新应该独立,客户端应该运行一系列更新?

  • 如果元数据库很大~GBytes . 管理其更新的最佳方法是什么?显然每次都不向整个数据库发送客户端 - 计算两个版本之间的增量的最佳方法是什么,只发送带有DML指令的脚本?

  • 如何管理数据库和代码库版本之间的依赖关系?例如,如果数据库模式中的字段已更改,那么代码库版本也应更新(代码版本X支持数据库版本Y)?

  • 如何在这些情况下处理故障恢复?例如,当安装一系列pip包更新时,其中一个在中间失败?如何恢复到以前的状态?除了复制文件之外,还有一种备份当前版本的好方法吗?