Генерация SQL-запросов используя Jinja-шаблон
Идея библиотеки заключается в попытке работать с SQL-запросами как с шаблонами Jinja. Вдохновлено embrace и jinjasql, оттуда же бралась часть кода.
Установка:
pip install classic-sql-tools
Quickstart:
from classic.sql_tools import Module
import psycopg
# Модуль - точка входа во все функции библиотеки.
# При инстанцировании запоминает указанный путь,
# дальнейшие обращения будут
queries = Module('path/to/sql/templates/dir')
# Создадим подключение к БД
conn = psycopg.connect('posgresql:///some_db')
# Применим схему:
queries.tasks.ddl(conn)
# Сохранение данных
queries.tasks.save_task(conn, [
{'title': 'Some Task', 'body': 'Do something'},
{'title': 'Another Task', 'body': 'Do anything'},
])
# Получение данных
task = queries.tasks.get_by_id(conn, id=1).one()
# (1, 'Some Task', 'Do something')
В директории sql рядом с .py файлом надо разместить 3 файла (можно найти в директории test/example):
sql/tasks/ddl.sql:
CREATE TABLE tasks (
id serial PRIMARY KEY,
title text,
body text
);
sql/tasks/get_by_id.sql:
SELECT id, title, body FROM tasks WHERE id = {{ id }};
sql/tasks/save_task.sql:
INSERT INTO tasks (title, body) VALUES ({{ title }}, {{ body }});
Возможности
# Класс Module - точка входа во все функции библиотеки.
from classic.sql_tools import Module
# При инстанцировании ему обязательно нужно
# передать путь до директории с шаблонами.
queries = Module('path/to/sql')
# Затем можно получить шаблон запроса, лежащего,
# например, в `./sql/some_file.sql`:
query = queries.some_file
# Module поддерживает обращение имен директорий в Python.
# То есть объект-запрос можно получить,
# обратившись к атрибуту Module с названием директории.
# Например, файл, лежащий в `./sql/some_dir/some_file.sql`:
query = queries.some_dir.some_file
#Вложенность может быть любой:
query = queries.some_dir.another_dir.etc.some_file
#Также можно получить объект запроса,
#напрямую обратившись по его относительному пути:
query = queries.from_file('sql/some_dir/some_file.sql')
# И можно получить объект запроса из строкового литерала:
query = queries.from_str('SELECT id FROM tasks')
# После получения объект запроса можно выполнить
# с использованием соединения или курсора:
import psycopg
conn = psycopg.connect('posgresql:///some_db')
result = queries.tasks.get_by_id(conn)
# Либо
cursor = conn.cursor()
result = queries.tasks.get_by_id(cursor)
# Также можно выполнить запрос через метод .execute:
query = queries.tasks.get_by_id
query.execute(conn)
# Объект результата нужен для удобного представления
# результатов запроса. У него есть методы для представления набора строк,
# единичных строк и единичных значений -
# .many(), .one() и .scalar() соответственно
# Вернет список кортежей:
result = queries.from_str('SELECT * FROM tasks').execute(conn)
print(result.many())
# Вернет до 100 строк. При повторном вызове вернет следующие 100:
result = queries.from_str('SELECT * FROM tasks').execute(conn)
print(result.many(100))
print(result.many(100))
# Вернет один кортеж или None:
result = queries.from_str(
'SELECT * FROM tasks WHERE id = 1'
).execute(conn)
print(result.one())
# Вернет один кортеж или исключение ValueError,
# если в БД ничего не нашлось:
result = queries.from_str('SELECT * FROM tasks WHERE id = 1').execute(conn)
print(result.one(raising=True))
# Вернет один кортеж или None:
result = queries.from_str(
'SELECT id FROM tasks WHERE id = 1'
).execute(conn).scalar()
print(result.scalar())
# Аналогично .one() вернет один кортеж или
# исключение ValueError, если в БД ничего не нашлось:
result = queries.from_str('SELECT id FROM tasks WHERE id = 1').execute(conn)
print(result.scalar(raising=True))
Metadata
Release files for classic-sql-tools 0.4.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| classic_sql_tools-0.4.4.tar.gz | 11.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| classic_sql_tools-0.4.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.6 kB
Release files / classic_sql_tools-0.4.4.tar.gz
| Download URL | classic_sql_tools-0.4.4.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
107cde3d66145325933425026156694d73ce27297cc128c8f213cd0d70f1c949
|
|
BLAKE2b-256 checksum How to use checksums |
4c120cb5f854cf0b77eadf8bd1387308e19bebdabb51f4b68893d333bbf4e89a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Release files / classic_sql_tools-0.4.4-py3-none-any.whl
| Download URL | classic_sql_tools-0.4.4-py3-none-any.whl |
|---|---|
| Size | 10.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b906b0504fff8723f0559f0231d4b47817c092227feabbfbfc8571e0384943f6
|
|
BLAKE2b-256 checksum How to use checksums |
766631cda85e91847662deb2d01538c1117f860adeed96a0982c4aa0d9287bb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Security for classic-sql-tools 0.4.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.