导出/导入元数据
项目的所有代码、参数和数据结构信息都存储在项目文件夹中的 admin.sqlite SQLite 数据库中。我们将此信息称为元数据。
导出元数据
通过点击在应用程序构建器中的 导出 按钮,可以将项目元数据导出到 zip 文件。
该文件包含以下信息:
项目数据结构的信息(有关项目实体定义的数据库表、字段、索引的信息)、存储在 admin.sqlite 数据库中的代码和设置。
来自以下文件夹的文件: * css * js * static/css * static/js * static/img * reports(项目报表模板的 ods 文件) * utils(此文件夹可能包含项目中使用的 Python 库或文件)
导入元数据
可以将元数据文件导入到另一个项目中。
Web 应用程序在导入元数据时执行以下操作:
设置 under_maintenance(维护中)标志,以便应用程序不处理传入的请求。 当接收到这些请求的响应时,客户端应用程序会显示"网站当前正在维护中"的消息。 并行运行的 Web 应用程序在收到请求时也会检查 under_maintenance 标志是否设置, 如果是,同样不处理请求。
将元数据文件解压缩到项目目录的临时文件夹中
检查数据完整性——当前项目和导入的元数据中具有相同 ID 的实体项必须具有相同的类型, 如果为项目指定了 table_name 属性,则也必须相同
分析元数据以生成更新项目数据库结构和 admin.sqlite 数据库记录的 SQL 查询
如果项目 参数 中的 **Import delay**(导入延迟)属性已设置, 则等待该属性中设置的秒数,否则等待 5 分钟或直到所有先前的服务器请求都被处理完毕
更新项目数据库并修改 admin.sqlite 的记录,参见下文( bellow )
将文件从临时文件夹复制到项目文件夹
重新加载任务树
将导入日志文件写入 logs 文件夹,并将导入日志发送到应用程序构建器显示
删除临时文件夹
移除 under_maintenance 标志
增加 build 标志,以便并行运行的 Web 应用程序监控此标志并重新加载它们的任务树
更新项目数据库
项目数据库的更新方式取决于项目数据库的类型。
支持 DDL 语句回滚的数据库更新(Postgress、Firebird、MSSQL)
创建到项目数据库的连接
开始执行 SQL 语句以更新项目数据库。
如果在更新项目数据库时发生错误,则回滚更改,并转到步骤 9。
项目数据库更新后,创建 admin.sqlite 文件的副本,并开始修改 admin.sqlite 数据库
如果在修改 admin.sqlite 记录时发生错误,则从副本恢复 admin.sqlite,回滚对项目数据库的更改,并转到步骤 9。
提交更改,删除 admin.sqlite 的副本,关闭连接并转到步骤 7。
不支持 DDL 语句回滚的数据库更新(MySql、Oracle)
创建到项目数据库的连接
开始执行 SQL 语句以更新项目数据库。
如果在更新项目数据库时发生错误,则将错误写入导入日志并继续执行,直到处理完所有语句
提交更改
开始修改 admin.sqlite 数据库
关闭连接并转到步骤 7。
错误原因
由于 Jam.py 项目的所有实体项和字段都具有唯一的 ID 属性, Jam.py 能够非常精确地生成修改项目数据库的 SQL 查询。
在生成 SQL 查询时,应用程序目前仅比较当前项目和导入项目中的元数据。 当应用程序尝试向表中添加一个在当前项目元数据中不存在但在数据库表中存在的字段时, 可能会发生错误(您在应用程序构建器之外创建了此字段)。 这种情况可以通过在应用程序构建器中使用手动模式来纠正, 请参阅 数据库 ,并修改数据库。
如果您不更改生产数据库的表、字段和索引,就不会有问题。 请在开发项目上进行开发,然后将其元数据导入到生产环境中。
备注
对于不支持 DDL 语句回滚的数据库(MySql、Oracle), 我们建议在执行导入之前备份项目数据库和 admin.sqlite 。
备注
对于 SQLite 数据库,Jam.py 不支持将元数据导入到现有项目(数据库中已有表的项目)中。您只能将元数据导入到新项目中。