diff --git a/frappe/database/query.py b/frappe/database/query.py index 4852f80739..cdca28601d 100644 --- a/frappe/database/query.py +++ b/frappe/database/query.py @@ -5,11 +5,12 @@ from types import BuiltinFunctionType from typing import TYPE_CHECKING import sqlparse -from pypika.queries import QueryBuilder +from pypika.queries import QueryBuilder, Table import frappe from frappe import _ from frappe.database.operator_map import OPERATOR_MAP +from frappe.database.utils import get_doctype_name from frappe.query_builder import Criterion, Field, Order, functions from frappe.query_builder.functions import Function, SqlFunctions from frappe.query_builder.utils import PseudoColumnMapper @@ -28,7 +29,7 @@ COMMA_PATTERN = re.compile(r",\s*(?![^()]*\))") class Engine: def get_query( self, - table: str, + table: str | Table, fields: list | tuple | None = None, filters: dict[str, str | int] | str | int | list[list | str | int] | None = None, order_by: str | None = None, @@ -43,8 +44,13 @@ class Engine: ) -> QueryBuilder: self.is_mariadb = frappe.db.db_type == "mariadb" self.is_postgres = frappe.db.db_type == "postgres" - self.doctype = table - self.table = frappe.qb.DocType(table) + + if isinstance(table, Table): + self.table = table + self.doctype = get_doctype_name(table.get_sql()) + else: + self.doctype = table + self.table = frappe.qb.DocType(table) if update: self.query = frappe.qb.update(self.table) diff --git a/frappe/database/utils.py b/frappe/database/utils.py index 4ea039e5a7..f89ba3c737 100644 --- a/frappe/database/utils.py +++ b/frappe/database/utils.py @@ -34,6 +34,14 @@ def is_pypika_function_object(field: str) -> bool: return getattr(field, "__module__", None) == "pypika.functions" or isinstance(field, Function) +def get_doctype_name(table_name: str) -> str: + if "tab" in table_name: + table_name = table_name.replace("tab", "") + table_name = table_name.replace("`", "") + table_name = table_name.replace('"', "") + return table_name + + class LazyString: def _setup(self) -> None: raise NotImplementedError