项目在其生命周期中经常会经历与数据库结构相关的变更。
有时也可能需要对现有数据进行修补。Frappe 内置了处理这些场景的工具。
当你从任何 Frappe 应用(包括 Frappe 本身)拉取更新时,应运行bench migrate 来应用结构变更和数据迁移(如果有)。
结构变更
你可以编辑 DocType 来添加、删除或修改字段。保存 DocType 时,
包含 DocType 数据的 JSON 文件会被添加到应用的源代码树中。
当你将应用添加到站点时,DocType 会使用此 JSON 文件进行安装。
要进行结构变更,需要在配置中设置 developer_mode。
运行同步(bench migrate)时,系统中的 doctype 会根据应用中的 JSON 文件
同步到其最新版本。
注意:字段是软删除的,即列不会从数据库表中移除,
但它们将不会在文档中可见。这样做是为了避免任何潜在的数据丢失情况,
并允许你编写可能需要已删除字段值的数据迁移脚本。
注意:Frappe 不支持反向结构迁移。
数据迁移
在引入与数据相关的更改时,你可能希望运行一次性脚本来
修改现有数据,以符合新代码的预期。
要向代码中添加数据迁移,你需要编写一个 execute
函数到一个 Python 模块中,并将其添加到应用的 patches.txt 中。
或者,你可以使用以下命令以交互方式创建一个新的补丁:
$ bench create-patch
Select app for new patch (frappe, hrms, ecommerce_integrations, erpnext): frappe
Provide DocType name on which this patch will apply: User
Describe what this patch does: Improve Indexing
Provide filename for this patch [improve_indexing.py]:
Patch folder '/home/ankush/benches/develop/apps/frappe/frappe/core/doctype/user/patches' doesn't exist, create it? [Y/n]: y
Created /home/ankush/benches/develop/apps/frappe/frappe/core/doctype/user/patches/improve_indexing.py and updated patches.txt
建议在路径中创建一个包含补丁编号和名称的文件,
并将其添加到应用中的补丁包(目录)中。然后,你可以将补丁模块的
点分路径添加到 patches.txt 中。
Frappe 中遵循的目录结构如下所示:
frappe
└── patches
└── 4_0
└── my_awesome_patch.py
可以通过添加如下一行来将补丁添加到 patches.txt:
frappe.patches.4_0.my_awesome_patch
在 execute 函数中可用的元数据(即 DocType)将是应用中的 JSON 文件所对应的
最新版本。但是,你将无法访问系统任何先前状态的元数据。
一次性 Python 语句
你还可以使用以下语法在 patches.txt 中添加一次性 Python 语句:
execute:{python 语句}
例如:
execute:frappe.get_doc(“User”, “Guest”).save()
注意:patches.txt 中的所有行必须是唯一的。如果你想运行某行两次,
可以通过添加不同的注释使其唯一。
例如:
execute:frappe.installer.make_site_dirs() #2014-02-19