postgresql Odoo 9在数据库中物理存储`res.partner`记录的`image`字段?

mlnl4t2r  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

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

vof42yt1

vof42yt11#

从Odoo 9开始,许多binary字段已被修改为存储在ir.attachment模型(ir_attachment表)中。这样做是为了受益于文件系统存储(和重复数据删除属性)并避免数据库膨胀。
这在带有attachment=True参数的二进制字段上启用,就像对res.partnerimage字段所做的那样。
激活时,二进制字段的get()set()方法将存储和检索ir.attachment表中的值。如果查看代码,您将看到附件使用以下值来建立到原始记录的链接:

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

因此,如果您想检索res.partnerimage记录,其中包含ID为32的image的值,则可以使用以下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实现附件重复删除的方式:具有相同文件的多个附件将Map到磁盘上的相同唯一文件。
如果您想以编程方式修改image字段的值,强烈建议使用ORM API(例如write()方法),以避免产生不一致或必须手动重新实现文件存储系统。

参考文献

  • 下面是original 9.0 commit,它引入了将二进制字段存储为附件的特性
  • 以及转换res.partner的image字段以使用它的9.0 commit

相关问题