Simple Typed Python Database Client based PEP 249
Project description
Turu: Simple Database Client for Typed Python
Documentation: https://yassun7010.github.io/turu-py/
Source Code: https://github.com/yassun7010/turu-py
Installation
pip install "turu[snowflake]"
Why Turu?
SQL is a powerful language, but it has many dialects, and Cloud Native Databases are especially difficult to test automatically in a local environment.
Turu was developed as a simple tool to assist local development. It provides a simple interface according to PEP 249 – Python Database API Specification v2.0 and allows for easy recording of query results and injection mock data.
Features
- :rocket: Simple - Turu is a simple database api wrapper of PEP 249.
- :bulb: Type Hint - Full support for type hints.
- :zap: Async/Await - Async/Await supports.
- :test_tube: Recoed and Mock - Record and mock database queries for testing.
Supprted Database
Database | Sync Support | Async Support | Installation |
---|---|---|---|
SQLite3 | Yes | Yes | pip install "turu[sqlite3]" |
MySQL | Yes | Yes | pip install "turu[mysql]" |
PostgreSQL | Yes | Yes | pip install "turu[postgres]" |
Snowflake | Yes | Yes | pip install "turu[snowflake]" |
BigQuery | Yes | No | pip install "turu[bigquery]" |
Usage
Basic Usage
from pydantic import BaseModel
class Row(BaseModel):
id: int
name: str
connection = turu.sqlite3.connect("test.db")
with connection.cursor() as cursor:
assert cursor.execute_map(Row, "select 1, 'a'").fetchone() == Row(id=1, name="a")
Testing
import turu.sqlite3
from pydantic import BaseModel
class Row(BaseModel):
id: int
name: str
expected1 = [Row(id=1, name="a"), Row(id=2, name="b")]
expected2 = [Row(id=3, name="c"), Row(id=4, name="d")]
expected3 = [Row(id=5, name="e"), Row(id=6, name="f")]
connection = turu.sqlite3.MockConnection()
(
connection.chain()
.inject_response(Row, expected1)
.inject_response(Row, expected2)
.inject_response(Row, expected3)
)
for expected in [expected1, expected2, expected3]:
with connection.cursor() as cursor:
assert cursor.execute_map(Row, "select 1, 'a'").fetchall() == expected
Recording and Testing
Your Production Code
import os
import turu.sqlite3
from turu.core.record import record_to_csv
from your_package.data import RECORD_DIR
from your_package.schema import Row
def do_something(connection: turu.sqlite3.Connection):
with record_to_csv(
RECORD_DIR / "test.csv",
connection.curosr(),
enable=os.environ.get("ENABLE_RECORDING"),
limit=100,
) as cursor:
... # Your logic
Your Test Code
import turu.sqlite3
from your_package.data import RECORD_DIR
from your_package.schema import Row
def test_do_something(connection: turu.sqlite3.MockConnection):
connection.inject_response_from_csv(Row, RECORD_DIR / "test.csv")
assert do_something(connection) is None
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
File details
Details for the file turu-0.12.0.tar.gz
.
File metadata
- Download URL: turu-0.12.0.tar.gz
- Upload date:
- Size: 3.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c526d6f1362755297420368e17edb029919ab408e61bb58a1ff5fc30a92756e6 |
|
MD5 | 11e150e6378379a17f54baad5c3af77a |
|
BLAKE2b-256 | d996c32bb17996d87dd2a601ddda5fbeb378a8f3dd48d76cf9527e17988f63d4 |
File details
Details for the file turu-0.12.0-py3-none-any.whl
.
File metadata
- Download URL: turu-0.12.0-py3-none-any.whl
- Upload date:
- Size: 2.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a1834fe8678237f61df62cc7df98144b52eb6d0cafa7eef0fa014a483b081e5f |
|
MD5 | 8aa6005f2ed46091e5869154966e06ac |
|
BLAKE2b-256 | aee1526d349037e4396e60a5ab1fd364f691adbf7673d0fb80cc678b4d6e0f50 |