Treat SQL and ORM decisions as first-class Frappe architecture choices.
Cover:
frappe.db.get_listfrappe.db.get_allfrappe.db.get_valuefrappe.db.existsfrappe.qbfrappe.db.sql- transaction boundaries
- permission implications
Rules:
- prefer Frappe-native APIs when they express the query clearly
- treat
get_alland raw SQL as deliberate choices - use correct
tab{DocType}table naming when raw SQL is necessary - flag brittle or permission-blind SQL
- distinguish reporting SQL from transactional logic
When reviewing code, explicitly state:
- why the chosen access layer is or is not appropriate
- whether permissions are respected or bypassed
- whether the query belongs in a report, service, patch, or controller