A Python package that seamlessly integrates PostgreSQL, Jinja templating, and Pydantic for type-safe database queries
Project description
pgjinja
A Python library that combines PostgreSQL with Jinja2 templates to create dynamic SQL queries with a clean, async interface.
Description
pgjinja simplifies database interactions by allowing you to:
- Keep SQL queries in separate template files
- Use Jinja2 templating for dynamic query generation
- Execute queries asynchronously
- Automatically map query results to Pydantic models
This approach helps separate SQL logic from application code, making your database interactions more maintainable and testable.
Installation
pip install pgjinja
Usage Example
Here's a simple example of how to use pgjinja to query merchants from a database:
# src/my_db.py
from functools import cache
from src.models.merchant import Merchant
from pgjinja import PgJinja
# Create a PostgreSQL connection
@cache
def get_postgres():
return PgJinja(
user="user",
password="password",
host="dev.postgres",
template_dir="template",
dbname="dbname",
)
# Query using a template with parameters
async def select_merchant(limit: int = 3) -> list[Merchant]:
params = dict(limit=limit)
template = "select_merchant.sql.jinja"
return await get_postgres().query(template, params, Merchant)
# Add other database operations here
# ...
# main.py
import asyncio
import src.my_db as db
# Example usage
async def main():
merchants = await db.select_merchant(limit=5) # clean and very readable
# Even with a more complex query, the interface is still the same
print(merchants)
if __name__ == "__main__":
asyncio.run(main())
SQL Template Example
Create a file template/select_merchant.sql.jinja:
SELECT id, name
FROM merchants
WHERE active = true
ORDER BY name
LIMIT {{ limit }}
Configuration
The PgJinja class accepts the following configuration parameters:
| Parameter | Description | Default |
|---|---|---|
| user | PostgreSQL user | (Required) |
| password | PostgreSQL password | (Required) |
| host | Database host | localhost |
| port | Database port | 5432 |
| dbname | Database name | public |
| template_dir | Directory containing SQL templates | Current directory |
| template_extension | File extension to append to template names | Empty string |
Asynchronous Execution and Connection Pooling
pgjinja leverages modern Python's async capabilities and PostgreSQL connection pooling for optimal performance:
- Async/await pattern: All database operations use the async/await pattern for non-blocking execution
- Connection pooling: Built-in connection pooling via
psycopg_poolreduces connection overhead - Resource management: Connections are automatically returned to the pool after query execution
- Concurrent queries: Multiple queries can be executed concurrently without blocking the main thread
This approach is particularly beneficial for web applications and API services where database operations should not block the event loop while waiting for results.
Dependencies
asyncio- For asynchronous operationspydantic- For data validation and model mappingjinjasql2- For SQL templating with Jinja2psycopg- PostgreSQL database adapter for Pythonpsycopg_pool- Connection pooling for psycopg
Development and Testing
Setting Up Development Environment
-
Clone the repository:
git clone https://github.com/tungph/pgjinja.git cd pgjinja
-
Create and activate a virtual environment:
uv venv . .venv/bin/activate
-
Install development dependencies:
uv pip install pytest pytest-asyncio pytest-cov pip install -e .
Running Tests
To run the test suite:
make test
This will:
- Set up a virtual environment
- Install necessary test dependencies
- Run the tests with code coverage reporting
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pgjinja-1.1.0.tar.gz.
File metadata
- Download URL: pgjinja-1.1.0.tar.gz
- Upload date:
- Size: 6.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8cfaac3ed84b1c08256727a94d6cfd218d4f913686efd2523987959f0a57b9c3
|
|
| MD5 |
76002f3eaa34bb09310c3c475c99328d
|
|
| BLAKE2b-256 |
cdb2d1e66b0fed30a53b0feceac7f0ea75867cb86bdabeda57eb9309c8484daa
|
File details
Details for the file pgjinja-1.1.0-py3-none-any.whl.
File metadata
- Download URL: pgjinja-1.1.0-py3-none-any.whl
- Upload date:
- Size: 5.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea1b70fa468dc48b86fbd396a4a6867bd5c1625828544a35fab8cbe9f2bf3c11
|
|
| MD5 |
adf5cede145bb2e0aa2f1f9d12929ba6
|
|
| BLAKE2b-256 |
1efe50fefd53cfb668e3e91a613c86b4fcbecb66eda13508deb417f0feef443d
|