Documentation Frappe Framework

Frappe Framework

Query Builder

DocType ajoute le préfixe tab. Table ne l’ajoute pas. Les fonctions JSON existent à partir de la v16. Le code MATCH publié ne compile pas tel quel.

3 min de lectureMis à jour le Source : docs.frappe.io

Rôle

frappe.qb enveloppe PyPika pour un même langage sur plusieurs bases. frappe.db.sql reste possible. L’exemple compte les vues de page web, dont celles dont is_unique vaut 1, entre deux dates. La version builder importe DocType, Count et Case. Elle sélectionne le chemin et deux comptes. Le where publié utilise Web_Page_View, qui n’est pas le nom WebPageView créé au-dessus.

Construire

frappe.qb renvoie un objet de pypika.dialects, avec des ajouts Frappe. from_('Customer').select(...) produit SELECT ... FROM tabCustomer. Un exemple plus long filtre fname Max ou id comme RA%, puis lname Mustermann. | est OR, & est AND. Enchaîner where ajoute AND. Le détail est dans PyPika.

frappe.qb.DocType renvoie la table et ajoute tab si besoin. frappe.qb.Table ne l’ajoute pas : tables du genre __Auth. À n’utiliser qu’en sachant ce qu’on fait. frappe.qb.Field est une colonne. L’exemple publié écrit frapppe.qb et name_of_coloum.

str(query) et get_sql() donnent le même SQL, avec des guillemets doubles dans cet exemple.

Exécuter

walk montre la requête paramétrée et le dictionnaire. Les champs, valeurs et fonctions deviennent des paramètres nommés, contre l’injection. L’exemple DocType dont le name est somename donne %(param1)s et {'param1': 'somename'}.

run est la voie préférée. Il accepte les options de frappe.db.sql. debug=True affiche le SQL et le temps. as_dict=True renvoie une liste de dictionnaires. L’exemple ToDo renvoie le name 8d765f73a2. En interne, run appelle frappe.db.sql.

Passer l’objet directement à frappe.db.sql ignore les droits et le paramétrage. La phrase publiée est tronquée : « ou may » , « permisions », « paramaterisation ».

Fonctions

frappe.query_builder.functions apporte Count et Sum. Jointures et sous-requêtes : la doc PyPika, avec frappe.qb.DocType à la place de Table. L’exemple joint Has Role et Custom Role sur CustomRole.name == HasRole.parent.

Compter Notes.content sous l’alias Pages, en as_dict.

Depuis la v16, le JSON est portable entre MariaDB et Postgres : JSONExtract, JSONValue, JSONContains. L’exemple Customer Profile lit $.language et $.notifications.email, et filtre l’e-mail égal à la chaîne "true". L’exemple commande filtre les codes qui contiennent FREESHIP, via JSONContains sur JSONExtract de $.codes.

Les fonctions PyPika sont toutes là. CustomFunction en ajoute. L’exemple DATE_DIFF utilise Tables('Customer'), pas Table, et Query.from_. Le SQL imprimé n’a pas le préfixe tab.

ConstantColumn pose une colonne fictive. ConstantColumn("john").as_("user") donne `user` valant 'john'.

Avancé

MATCH AGAINST s’hérite de DistinctOptionFunction. La classe publiée est incomplète : *args sans parenthèse fermante, _init_ au lieu de __init__, et une f-string dont la parenthèse ne ferme pas comme le SQL affiché. En usage, Match("Coloum name").Against("Some_text_match") est commenté comme MATCH(...) AGAINST ('+Some_text_match*' IN BOOLEAN MODE). @builder rend l’appel chaînable en copiant l’objet.

ImportMapper choisit une fonction selon le dialecte. L’exemple GroupConcat, écrit « GroupConat » dans la prose, mappe GROUP_CONCAT pour MariaDB et STRING_AGG pour Postgres, via db_type_is.

Point d’attention

frappe.db.sql sur l’objet ne paramètre pas. Table n’ajoute pas tab. Le premier exemple et la classe MATCH, tels que publiés, ne correspondent pas aux noms et à la syntaxe du reste de la page.

Query Builder PyPika de Frappe | ERPNext Lab