Query builder for Python applications. Designed to work with MUI-QueryBuilder.
Py-QueryBuilder is available as a pypi package.
pip install py-querybuilder
Here is a quick example to get you started.
First you'll need a templates
folder in your module, containing Jinja2 templates with a {{ where }}
placeholder:
SELECT *
FROM my_table
WHERE {{ where }}
You can now rely on the QueryBuilder
class to render queries:
from py_querybuilder import QueryBuilder
qb = QueryBuilder("app.articles", [
{
"label": "Article",
"options": [
{
"label": "Title",
"value": "title",
"type": "text",
},
{
"label": "URL",
"value": "url",
"type": "text",
},
],
},
])
sql_query, sql_params = qb.render("query.sql", {
"combinator": "and",
"rules": [
{
"field": "title",
"operator": "contains",
"value": "Brazil",
},
],
})
The query is generated with JinjaSQL, a template language for SQL statements and scripts. Since it's based in Jinja2, you have all the power it offers: conditional statements, macros, looping constructs, blocks, inheritance, and more. We use sqlparse to format the queries.
SELECT *
FROM my_table
WHERE title ~* ? AS "Title"
The default operators used for generating queries are:
{
"after": ">",
"after_equal": ">=",
"before": "<",
"before_equal": "<=",
"contains": "~*",
"greater": ">",
"greater_equal": ">=",
"equal": "=",
"in": "in",
"less": "<",
"less_equal": "<=",
"not_contains": "!~*",
"not_equal": "!=",
"not_in": "not in",
"not_null": "is not null",
"null": "is null",
}
In case the database you're targeting uses different operators, it's possible to customize those at QueryBuilder
's instantiation:
qb = QueryBuilder(my_module, my_query, operators={
# Custom operators.
})
SQL parameters are returned from render()
in a list of values corresponding to the placeholders that need to be bound to the query.
print(sql_params)
# ["Brazil"]
Finally, you can now use the SQL query and its bind parameters to fetch data. For example, in Django, you would do something like this:
from django.db import connection
with connection.cursor() as cursor:
cursor.execute(sql_query, sql_params)
for row in cursor.fetchall():
# Do something with the results.
pass
Check out the API documentation. To learn more about the query's data structure, and how filters and operators work, please refer to MUI-QueryBuilder.
This project is licensed under the terms of the MIT license.