跳到主要内容

Frappe的数据类型的DB映射

frappe/database/mariadb/database.py 文件中,有一个 setup_type_map 方法,该方法定义了不同字段类型在数据库中的映射关系

def setup_type_map(self):
self.db_type = "mariadb"
self.type_map = {
"Currency": ("decimal", "21,9"),
"Int": ("int", None),
"Long Int": ("bigint", "20"),
"Float": ("decimal", "21,9"),
"Percent": ("decimal", "21,9"),
"Check": ("tinyint", None),
"Small Text": ("text", ""),
"Long Text": ("longtext", ""),
"Code": ("longtext", ""),
"Text Editor": ("longtext", ""),
"Markdown Editor": ("longtext", ""),
"HTML Editor": ("longtext", ""),
"Date": ("date", ""),
"Datetime": ("datetime", "6"),
"Time": ("time", "6"),
"Text": ("text", ""),
"Data": ("varchar", self.VARCHAR_LEN),
"Link": ("varchar", self.VARCHAR_LEN), # 这里定义了 Link 类型对应的数据库类型
"Dynamic Link": ("varchar", self.VARCHAR_LEN),
"Password": ("text", ""),
"Select": ("varchar", self.VARCHAR_LEN),
"Rating": ("decimal", "3,2"),
"Read Only": ("varchar", self.VARCHAR_LEN),
"Attach": ("text", ""),
"Attach Image": ("text", ""),
"Signature": ("longtext", ""),
"Color": ("varchar", self.VARCHAR_LEN),
"Barcode": ("longtext", ""),
"Geolocation": ("longtext", ""),
"Duration": ("decimal", "21,9"),
"Icon": ("varchar", self.VARCHAR_LEN),
"Phone": ("varchar", self.VARCHAR_LEN),
"Autocomplete": ("varchar", self.VARCHAR_LEN),
"JSON": ("json", ""),
}

password的解释

对passord字段, 在数据库以及界面都是不可见的, 这是一种很好的机制。 如果的确要解开密码如下是方法:

from frappe.utils.password import get_decrypted_password

decrypted_password = get_decrypted_password('FND File Storage', '0e25550fb6', 'token')
参数是(doctype,docname,field)

print(decrypted_password)

currency的解释

在 Frappe 框架的源码中,"Currency": ("decimal", "21,9") 中的 "21,9" 表示的是数据库中 decimal 类型字段的精度和小数位数。具体来说:

  • 21: 这是该字段的总精度(precision),即该字段最多可以存储的数字总位数,包括小数点前后的所有数字。
  • 9: 这是该字段的小数位数(scale),即该字段可以存储的小数点后的数字位数。

具体解释

  • 总精度(precision): 21 表示这个 decimal 字段最多可以存储 21 位数字。
  • 小数位数(scale): 9 表示这个 decimal 字段最多可以存储 9 位小数。

例如,decimal(21,9) 可以存储的数字范围包括:

  • 123456789012345.123456789
  • -123456789012345.123456789

示例

假设有一个 Currency 类型的字段,其定义为 decimal(21,9),那么它可以存储的最大值是 999999999999999.999999999,最小值是 -999999999999999.999999999

源码位置

这个定义在 frappe/database/mariadb/database.py 文件中的 setup_type_map 方法中可以找到:

pythondef setup_type_map(self):
self.db_type = "mariadb"
self.type_map = {
"Currency": ("decimal", "21,9"),
# 其他类型的定义...
}

通过这种方式,Frappe 框架能够确保 Currency 类型的字段在数据库中具有足够的精度和小数位数,以满足财务数据存储的需求。