Odoo 9 将 `res.partner` 记录的 `image` 字段物理存储在数据库中的什么位置?

Where does Odoo 9 physically store the `image` field of `res.partner` records in the database?

我在 Odoo 9 PostgreSQL 数据库的 res_partner table 中找不到 image 列? Odoo 9 在哪里存储这个图像字段?

从 Odoo 9 开始,许多 binary 字段已被修改为存储在 ir.attachment 模型中 (ir_attachment table)。这样做是为了从文件系统存储(和重复数据删除属性)中获益并避免数据库膨胀。

这是在带有 attachment=True 参数的二进制字段上启用的,就像 res.partner's image fields 一样。

启用时,二进制字段的get()set()方法将store and retrieve the value in the ir.attachment table. If you look at the code,您将看到附件使用以下值建立link到原始记录:

  • name:二进制字段的名称,例如image
  • res_field:二进制字段的名称,例如image
  • res_model:包含字段的模型,例如res.partner
  • res_id:二进制字段所属记录的ID
  • type: 'binary'
  • datas:虚拟字段,内容为二进制字段,实际存储在磁盘上

因此,如果您想检索 ir.attachment 记录,其中包含 ID 为 32 的 res.partnerimage 的值,您可以使用以下 SQL :

SELECT id, store_fname FROM ir_attachment
WHERE res_model = 'res.partner' AND res_field = 'image' AND res_id = 32;

因为 ir_attachment 条目默认使用文件系统存储,store_fname 字段的实际值将为您提供 Odoo 文件存储中图像文件的路径,格式为 'ab/abcdef0123456789' 其中 abc... 值是文件的 SHA-1 哈希值。这就是 Odoo 实现附件去重的方式:具有相同文件的多个附件将映射到磁盘上相同的唯一文件。

如果您想以编程方式修改 image 字段的值,强烈建议使用 ORM API(例如 write() 方法),以避免造成不一致或必须手动重新实现文件存储系统。

参考资料