如何将 v5 项目迁移到 v7

对于任何 v5 项目,首先备份 index.html 文件,然后将 v7 Jam.py Demo 应用程序中的 index.htmltemplate.html 文件复制到你的应用目录下。 或者,也可以从用 jam-project.py 创建的新 v7 项目中复制同名文件。

卸载 v5 版本的 Jam.py 并安装 v7 版本。或者可以同时运行两个虚拟 Python 环境,分别安装两个版本的 Jam.py。

用 v7 Jam.py 正常启动应用。

需要注意以下事项:

  1. 迁移 Jam.py v5 应用程序的最大障碍是 “编辑锁(Edit Lock)” 。 如果表启用了该功能,Jam.py v7 期望每个启用编辑锁的表都包含一个 record_version (INT)字段。

    迁移到 v7 时有两个选择:一是在迁移前禁用 “编辑锁”, 二是在迁移前为相关表添加 record_version 字段。

    在数据库结构中添加该字段后,需要在应用构建器中手动添加该字段, 并为每个启用 “编辑锁” 的表开启 “数据库手动模式(DB Manual Mode)” 。 “记录版本(record version)” 选项应设置为 record_version 字段。

    显然,如果禁用 “编辑锁” ,则无需任何其它额外操作。 项目参数中也没有创建 “锁定实体项(Lock Item)” 的选项。

  2. 下一个问题是模板。Jam.py v7 期望应用程序目录下有 templates.html 文件。 由于使用了 Bootstrap 5,从 Jam.py v5 的 index.html 文件迁移现有模板到 templates.html 文件时会有一些小的差异。

  3. index.html 也需要调整,以适配 Bootstrap 5 依赖。请参考下方示例。

  4. v7 版本不再支持外键(Foreign Key)。 这意味着如果 v5 中创建了外键,v7 将无法管理外键。

  5. Jam.py v7 引入了 计算字段(calculated field) 。 现在可以在主/明细(Master/Detail)场景下,使用服务端函数(SUM、COUNT、MIN、MAX、AVG)对表字段进行汇总。用户可以根据需要,将服务端的计算代码替换为计算字段。

  6. Jam.py v7 现在采用 Python 依赖管理,初次安装时会自动安装所需库。 这与 v5 不同,v5 所有依赖都 “锁定” 在 Jam.py 分发包中,可以通过单一的 jam 文件夹部署应用。

  7. 对于 Jam.py 5.x 及以下版本的应用,将 Task/Client 模块代码替换为 Demo 应用或新 v7 项目的 Task/Client 模块代码。如果 v5 Task/Client 模块有自定义代码,再将其补充进去。

例如,Demo 应用的 index.html 文件内容如下:

<link href="jam/css/bootstrap-cerulean.css" rel="stylesheet">            <!--do not modify-->
<link href="jam/css/bootstrap-responsive.css" rel="stylesheet">
<link href="jam/css/bootstrap-modal.css" rel="stylesheet">
<link href="jam/css/datepicker.css" rel="stylesheet">
...
<script src="jam/js/bootstrap.js"></script>
<script src="jam/js/bootstrap-modal.js"></script>
<script src="jam/js/bootstrap-modalmanager.js"></script>
<script src="jam/js/bootstrap-datepicker.js"></script>
<script src="jam/js/jquery.maskedinput.js"></script>
<script src="jam/js/jam.js"></script>

需要修改为:

<link href="jam/css/bs5/bootstrap.css" rel="stylesheet">
<link href="jam/css/bs5/bootstrap-icons.css" rel="stylesheet">
<link href="jam/css/zebra_datepicker/bootstrap/zebra_datepicker.min.css" rel="stylesheet">
...
<script src="jam/js/bs5/bootstrap.bundle.js"></script>
<script src="jam/js/zebra_datepicker.js"></script>
<script src="jam/js/jquery.maskedinput.js"></script>
<script type="module" src="jam/js/jam.js"></script>

index.html 文件的其它部分只需做最小的调整。