Skip to content

Usage

Jinja2SQL provides a jinja2sql.Jinja2SQL class that can be used to generate SQL queries from string or file templates.

String Templates

To generate SQL queries from string templates, use the from_string method:

```python
from jinja2sql import Jinja2SQL

j2sql = Jinja2SQL(param_style="named")  # default param style is "named"

query, params = j2sql.from_string(
    "SELECT * FROM {{ table | identifier }} WHERE email = {{ email }}",
    context={"table": "users", "email": "user@mail.com"},
)


assert query == "SELECT * FROM users WHERE email = :email"
assert params == {"email": "user@mail.com"}

File Templates

To generate SQL queries from file templates, use the from_file method:

query.sql

SELECT * FROM {{ table | identifier }} WHERE email = {{ email }}

main.py

from pathlib import Path

from jinja2sql import Jinja2SQL

j2sql = Jinja2SQL(searchpath=Path(__name__).parent)  # default param style is "named"

query, params = j2sql.from_file(
    "query.sql",
    context={"table": "users", "email": "user@mail.com"},
)

assert query == "SELECT * FROM users WHERE email = :email"
assert params == {"email": "user@mail.com"}

Param Styles

Jinja2SQL supports different param styles depending on the database driver you are using.

You can choose between the following supported param styles:

from jinja2sql import Jinja2SQL


j2sql = Jinja2SQL(param_style="named")  # default

query, params = j2sql.from_string(
    "SELECT * FROM table WHERE param = {{ param }}",
    context={"param": ...},
    param_style="named",  # or "qmark", "numeric", "format", "pyformat", "asyncpg"
)
param_style Example
named :param
qmark ?
numeric :1
format %s
pyformat %(param)s
asyncpg $1

or you can provide a custom function to format your database specific param style:

from jinja2sql import Jinja2SQL


j2sql = Jinja2SQL()

query, params = j2sql.from_string(
    "SELECT * FROM table WHERE column = {{ param }}",
    context={"param": ...},
    param_style=lambda key, _: f"{{{key}}}",
)

assert query == "SELECT * FROM table WHERE column = {email}"

Async support

Jinja2SQL supports asynchroneous query generation using the enable_async flag:

from jinja2sql import Jinja2SQL

j2sql = Jinja2SQL(enable_async=True)

String Templates

To generate SQL queries from string templates, use the from_string_async method:

import asyncio

from jinja2sql import Jinja2SQL

j2sql = Jinja2SQL(param_style="named", enable_async=True)


async def main() -> None:
    query, params = await j2sql.from_string_async(
        "SELECT * FROM {{ table | identifier }} WHERE email = {{ email }}",
        context={"table": "users", "email": "user@mail.com"},
    )

    assert query == "SELECT * FROM users WHERE email = :email"
    assert params == {"email": "user@mail.com"}


asyncio.run(main())

File Templates

To generate SQL queries from file templates, use the from_file_async method:

query.sql

SELECT * FROM {{ table | identifier }} WHERE email = {{ email }}

main.py

import asyncio
from pathlib import Path

from jinja2sql import Jinja2SQL

j2sql = Jinja2SQL(searchpath=Path(__name__).parent, enable_async=True)


async def main() -> None:
    query, params = await j2sql.from_file_async(
        "query.sql",
        context={"table": "users", "email": "user@mail.com"},
    )

    assert query == "SELECT * FROM users WHERE email = :email"
    assert params == {"email": "user@mail.com"}


asyncio.run(main())