Cloudflare D1 client library for kiarina namespace
Project description
kiarina-lib-cloudflare-d1
A Python client library for Cloudflare D1 with configuration management using pydantic-settings-manager.
Purpose
This library separates infrastructure configuration (database IDs, credentials) from application code, enabling:
- Environment-agnostic code: Same code works in dev, staging, and production
- External configuration: Manage settings via YAML files or environment variables
- Multi-tenancy support: Handle multiple D1 databases with different configurations
- Easy testing: Inject test configurations without modifying code
Installation
pip install kiarina-lib-cloudflare-d1
Quick Start
Basic Usage (Sync)
from kiarina.lib.cloudflare.d1 import create_d1_client
# Create client (configuration loaded from environment or settings)
client = create_d1_client()
# Execute query
result = client.query("SELECT * FROM users WHERE id = ?", [1])
# Access results
if result.success:
for row in result.first.rows:
print(row)
Async Usage
from kiarina.lib.cloudflare.d1.asyncio import create_d1_client
async def main():
client = create_d1_client()
result = await client.query("SELECT * FROM users WHERE id = ?", [1])
if result.success:
for row in result.first.rows:
print(row)
CRUD Operations
from kiarina.lib.cloudflare.d1 import create_d1_client
client = create_d1_client()
# Create
result = client.query(
"INSERT INTO users (name, email) VALUES (?, ?)",
["Alice", "alice@example.com"]
)
# Read
result = client.query("SELECT * FROM users WHERE name = ?", ["Alice"])
users = result.first.rows
# Update
result = client.query(
"UPDATE users SET email = ? WHERE name = ?",
["alice.new@example.com", "Alice"]
)
# Delete
result = client.query("DELETE FROM users WHERE name = ?", ["Alice"])
Error Handling
result = client.query("SELECT * FROM users")
if not result.success:
# Check errors
for error in result.errors:
print(f"Error: {error}")
# Or raise exception
result.raise_for_status()
else:
# Access results safely
if result.result:
for row in result.first.rows:
print(row)
API Reference
Functions
create_d1_client()
Create a D1 client with configuration.
def create_d1_client(
settings_key: str | None = None,
*,
auth_settings_key: str | None = None,
) -> D1Client
Parameters:
settings_key: Configuration key for D1 settings (default: uses active key)auth_settings_key: Configuration key for authentication (default: uses active key)
Returns: Configured D1Client instance
Example:
# Use default configuration
client = create_d1_client()
# Use specific configuration
client = create_d1_client(
settings_key="production",
auth_settings_key="production"
)
Classes
D1Client
Main client for interacting with Cloudflare D1.
Methods:
query(sql: str, params: list[Any] | None = None) -> Result
Execute a SQL query with optional parameters.
Parameters:
sql: SQL query stringparams: Query parameters for parameterized statements (default: None)
Returns: Result object containing query results
Example:
# Simple query
result = client.query("SELECT * FROM users")
# Parameterized query
result = client.query("SELECT * FROM users WHERE age > ?", [18])
Result
Query result container.
Properties:
success(bool): Whether the query was successfulresult(list[QueryResult]): List of query resultserrors(list[ResponseInfo]): List of errors if query failedmessages(list[ResponseInfo]): List of informational messagesfirst(QueryResult): First query result (raises ValueError if empty)
Methods:
raise_for_status(): Raise RuntimeError if query failed
Example:
result = client.query("SELECT * FROM users")
# Check success
if result.success:
# Access first result
query_result = result.first
# Access all results
for qr in result.result:
print(qr.rows)
QueryResult
Individual query result with metadata and rows.
Properties:
success(bool): Whether this query was successfulmeta(dict[str, Any]): Query metadata (duration, rows read/written, etc.)results(list[dict[str, Any]]): Query result rowsrows(list[dict[str, Any]]): Alias forresults
Example:
query_result = result.first
# Access metadata
print(f"Duration: {query_result.meta.get('duration')}ms")
print(f"Rows read: {query_result.meta.get('rows_read')}")
# Access rows
for row in query_result.rows:
print(f"User: {row['name']}")
ResponseInfo
Error or message information.
Properties:
code(int): Response codemessage(str): Response message
Configuration
This library uses pydantic-settings-manager for configuration management and requires kiarina-lib-cloudflare-auth for authentication.
YAML Configuration
# config/production.yaml
kiarina.lib.cloudflare.d1:
default:
database_id: "prod-database-id"
kiarina.lib.cloudflare.auth:
default:
account_id: "prod-account-id"
api_token: "${CLOUDFLARE_API_TOKEN}" # From environment
# Load configuration using pydantic-settings-manager
import yaml
from pydantic_settings_manager import load_user_configs
with open("config/production.yaml") as f:
config = yaml.safe_load(f)
load_user_configs(config)
# Now create client with loaded configuration
client = create_d1_client()
Settings Reference
D1Settings
| Field | Type | Required | Description |
|---|---|---|---|
database_id |
str |
Yes | Cloudflare D1 database ID |
Environment variable prefix: KIARINA_LIB_CLOUDFLARE_D1_
Authentication Settings
See kiarina-lib-cloudflare-auth for authentication configuration details.
Required fields:
account_id: Cloudflare account IDapi_token: Cloudflare API token
Environment variable prefix: KIARINA_LIB_CLOUDFLARE_AUTH_
Testing
Tests require actual Cloudflare D1 credentials. Create a .env file:
# .env
KIARINA_LIB_CLOUDFLARE_D1_TEST_SETTINGS_FILE=/path/to/test_settings.yaml
Create test_settings.yaml:
kiarina.lib.cloudflare.auth:
default:
account_id: "your-test-account-id"
api_token: "your-test-api-token"
kiarina.lib.cloudflare.d1:
default:
database_id: "your-test-database-id"
Run tests:
# Run all checks
mise run package kiarina-lib-cloudflare-d1
# Run tests with coverage
mise run package:test kiarina-lib-cloudflare-d1 --coverage
Tests will be skipped if credentials are not configured.
Dependencies
- httpx - HTTP client
- kiarina-lib-cloudflare-auth - Cloudflare authentication
- pydantic-settings - Settings management
- pydantic-settings-manager - Advanced settings management
License
MIT License - see the LICENSE file for details.
Related Projects
- kiarina-python - Main monorepo
- kiarina-lib-cloudflare-auth - Cloudflare authentication library
- Cloudflare D1 - Cloudflare's serverless SQL database
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 kiarina_lib_cloudflare_d1-1.24.0.tar.gz.
File metadata
- Download URL: kiarina_lib_cloudflare_d1-1.24.0.tar.gz
- Upload date:
- Size: 8.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b11596dd6d5b78063fb0f414cb058cfbd14e730dde470716de398d681b7dac6
|
|
| MD5 |
f3f437388a103e882dd72370a60d910b
|
|
| BLAKE2b-256 |
035d13cf5428bc8f6d99b9b2814ec9508d12a60ba8d9883ee16938e973d4059a
|
File details
Details for the file kiarina_lib_cloudflare_d1-1.24.0-py3-none-any.whl.
File metadata
- Download URL: kiarina_lib_cloudflare_d1-1.24.0-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39d92d53d5b6c5d3b5fe3fbed078b86d0314e0cce2a2b30909c106805a2bb111
|
|
| MD5 |
77a1d45ae3d29d54db6b274e458d29aa
|
|
| BLAKE2b-256 |
d75d54b0f67622873718d5a0bde463d4964690a77857e15a2d28ddd0afb3dadc
|