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
类型的字段在数据库中具有足够的精度和小数位数,以满足财务数据存储的需求。