Loading...
Loading...
Compare original and translation side by side
| Level | API | Usage |
|---|---|---|
| High-level ORM | | Document CRUD with validations |
| Mid-level Query | | Reading with filters |
| Low-level SQL | | Complex queries, reports |
| 层级 | API | 用途 |
|---|---|---|
| 高层级ORM | | 带验证的文档增删改查 |
| 中层级查询 | | 带过滤条件的读取操作 |
| 低层级SQL | | 复杂查询、报表生成 |
What do you want to do?
│
├─ Create/modify/delete document?
│ └─ frappe.get_doc() + .insert()/.save()/.delete()
│
├─ Get single document?
│ ├─ Changes frequently? → frappe.get_doc()
│ └─ Changes rarely? → frappe.get_cached_doc()
│
├─ List of documents?
│ ├─ With user permissions? → frappe.db.get_list()
│ └─ Without permissions? → frappe.get_all()
│
├─ Single field value?
│ ├─ Regular DocType → frappe.db.get_value()
│ └─ Single DocType → frappe.db.get_single_value()
│
├─ Direct update without triggers?
│ └─ frappe.db.set_value() or doc.db_set()
│
└─ Complex query with JOINs?
└─ frappe.qb (Query Builder) or frappe.db.sql()What do you want to do?
│
├─ Create/modify/delete document?
│ └─ frappe.get_doc() + .insert()/.save()/.delete()
│
├─ Get single document?
│ ├─ Changes frequently? → frappe.get_doc()
│ └─ Changes rarely? → frappe.get_cached_doc()
│
├─ List of documents?
│ ├─ With user permissions? → frappe.db.get_list()
│ └─ Without permissions? → frappe.get_all()
│
├─ Single field value?
│ ├─ Regular DocType → frappe.db.get_value()
│ └─ Single DocType → frappe.db.get_single_value()
│
├─ Direct update without triggers?
│ └─ frappe.db.set_value() or doc.db_set()
│
└─ Complex query with JOINs?
└─ frappe.qb (Query Builder) or frappe.db.sql()undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefineddoc = frappe.get_doc({
'doctype': 'Task',
'subject': 'New Task',
'status': 'Open'
})
doc.insert()doc = frappe.get_doc({
'doctype': 'Task',
'subject': 'New Task',
'status': 'Open'
})
doc.insert()undefinedundefined
---
---{'status': 'Open'} # =
{'status': ['!=', 'Cancelled']} # !=
{'amount': ['>', 1000]} # >
{'amount': ['>=', 1000]} # >=
{'status': ['in', ['Open', 'Working']]} # IN
{'date': ['between', ['2024-01-01', '2024-12-31']]} # BETWEEN
{'subject': ['like', '%urgent%']} # LIKE
{'description': ['is', 'set']} # IS NOT NULL
{'description': ['is', 'not set']} # IS NULL{'status': 'Open'} # =
{'status': ['!=', 'Cancelled']} # !=
{'amount': ['>', 1000]} # >
{'amount': ['>=', 1000]} # >=
{'status': ['in', ['Open', 'Working']]} # IN
{'date': ['between', ['2024-01-01', '2024-12-31']]} # BETWEEN
{'subject': ['like', '%urgent%']} # LIKE
{'description': ['is', 'set']} # IS NOT NULL
{'description': ['is', 'not set']} # IS NULLTask = frappe.qb.DocType('Task')
results = (
frappe.qb.from_(Task)
.select(Task.name, Task.subject)
.where(Task.status == 'Open')
.orderby(Task.creation, order='desc')
.limit(10)
).run(as_dict=True)Task = frappe.qb.DocType('Task')
results = (
frappe.qb.from_(Task)
.select(Task.name, Task.subject)
.where(Task.status == 'Open')
.orderby(Task.creation, order='desc')
.limit(10)
).run(as_dict=True)SI = frappe.qb.DocType('Sales Invoice')
Customer = frappe.qb.DocType('Customer')
results = (
frappe.qb.from_(SI)
.inner_join(Customer)
.on(SI.customer == Customer.name)
.select(SI.name, Customer.customer_name)
.where(SI.docstatus == 1)
).run(as_dict=True)SI = frappe.qb.DocType('Sales Invoice')
Customer = frappe.qb.DocType('Customer')
results = (
frappe.qb.from_(SI)
.inner_join(Customer)
.on(SI.customer == Customer.name)
.select(SI.name, Customer.customer_name)
.where(SI.docstatus == 1)
).run(as_dict=True)undefinedundefinedundefinedundefinedfrom frappe.utils.caching import redis_cache
@redis_cache(ttl=300) # 5 minutes
def get_dashboard_data(user):
return expensive_calculation(user)from frappe.utils.caching import redis_cache
@redis_cache(ttl=300) # 5 minutes
def get_dashboard_data(user):
return expensive_calculation(user)
---
---| Context | Commit | Rollback |
|---|---|---|
| POST/PUT request | After success | On exception |
| Background job | After success | On exception |
| 上下文 | 提交 | 回滚 |
|---|---|---|
| POST/PUT 请求 | 成功后 | 发生异常时 |
| 后台任务 | 成功后 | 发生异常时 |
frappe.db.savepoint('my_savepoint')
try:
# operations
frappe.db.commit()
except:
frappe.db.rollback(save_point='my_savepoint')frappe.db.savepoint('my_savepoint')
try:
# operations
frappe.db.commit()
except:
frappe.db.rollback(save_point='my_savepoint')undefinedundefinedtabUsertabUsertabUserundefinedtabUserundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefined
---
---| Feature | v14 | v15 | v16 |
|---|---|---|---|
| Transaction hooks | ❌ | ✅ | ✅ |
| bulk_update | ❌ | ✅ | ✅ |
| Aggregate syntax | String | String | Dict |
| 特性 | v14 | v15 | v16 |
|---|---|---|---|
| 事务钩子 | ❌ | ✅ | ✅ |
| bulk_update | ❌ | ✅ | ✅ |
| 聚合语法 | 字符串 | 字符串 | 字典 |
undefinedundefined
---
---references/references/| Action | Method |
|---|---|
| Get document | |
| Cached document | |
| New document | |
| Save document | |
| Insert document | |
| Delete document | |
| Get list | |
| Single value | |
| Single value | |
| Direct update | |
| Exists check | |
| Count records | |
| Raw SQL | |
| Query Builder | |
| 操作 | 方法 |
|---|---|
| 获取文档 | |
| 获取缓存文档 | |
| 创建新文档 | |
| 保存文档 | |
| 插入文档 | |
| 删除文档 | |
| 获取文档列表 | |
| 获取单个字段值 | |
| 获取单文档类型字段值 | |
| 直接更新字段 | |
| 检查文档是否存在 | |
| 统计记录数 | |
| 原生SQL查询 | |
| 查询构建器 | |