A dict-like SQLite wrapper with APSW for instant persistence and memory caching
Project description
NanaSQLite
A dict-like SQLite wrapper with instant persistence and intelligent caching.
English
🚀 Features
- Dict-like Interface: Use familiar
db["key"] = valuesyntax - Instant Persistence: All writes are immediately saved to SQLite
- Smart Caching: Lazy load (on-access) or bulk load (all at once)
- Nested Structures: Full support for nested dicts and lists (up to 30+ levels)
- High Performance: WAL mode, mmap, and batch operations for maximum speed
- Zero Configuration: Works out of the box with sensible defaults
📦 Installation
pip install nanasqlite
⚡ Quick Start
from nanasqlite import NanaSQLite
# Create or open a database
db = NanaSQLite("mydata.db")
# Use it like a dict
db["user"] = {"name": "Nana", "age": 20, "tags": ["admin", "active"]}
print(db["user"]) # {'name': 'Nana', 'age': 20, 'tags': ['admin', 'active']}
# Data persists automatically
db.close()
# Reopen later - data is still there!
db = NanaSQLite("mydata.db")
print(db["user"]["name"]) # 'Nana'
🔧 Advanced Usage
# Bulk load for faster repeated access
db = NanaSQLite("mydata.db", bulk_load=True)
# Batch operations for high-speed writes
db.batch_update({
"key1": "value1",
"key2": "value2",
"key3": {"nested": "data"}
})
# Context manager support
with NanaSQLite("mydata.db") as db:
db["temp"] = "value"
📚 Documentation
✨ New Features (v1.0.3rc3+)
Pydantic Support:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
db.set_model("user", User(name="Nana", age=20))
user = db.get_model("user", User)
Direct SQL Execution:
# Execute custom SQL
cursor = db.execute("SELECT * FROM data WHERE key LIKE ?", ("user%",))
rows = db.fetch_all("SELECT key, value FROM data")
SQLite Wrapper Functions:
# Create tables and indexes easily
db.create_table("users", {
"id": "INTEGER PRIMARY KEY",
"name": "TEXT NOT NULL",
"email": "TEXT UNIQUE"
})
db.create_index("idx_users_email", "users", ["email"])
# Simple queries
results = db.query(table_name="users", where="age > ?", parameters=(20,))
✨ Additional Features (v1.0.3rc4+)
22 new wrapper functions for comprehensive SQLite operations:
# Data operations
rowid = db.sql_insert("users", {"name": "Alice", "age": 25})
db.sql_update("users", {"age": 26}, "name = ?", ("Alice",))
db.upsert("users", {"id": 1, "name": "Alice", "age": 25})
total = db.count("users", "age >= ?", (18,))
# Query extensions (pagination, grouping)
page2 = db.query_with_pagination("users", limit=10, offset=10)
stats = db.query_with_pagination("orders",
columns=["user_id", "COUNT(*) as count"], group_by="user_id")
# Schema management
db.alter_table_add_column("users", "phone", "TEXT")
schema = db.get_table_schema("users")
db.drop_table("old_table", if_exists=True)
# Utilities & transactions
db.vacuum() # Optimize database
with db.transaction():
db.sql_insert("logs", {"message": "Event"})
✨ Async Support (v1.0.3rc7+)
Full async/await support with optimized thread pool for high-performance non-blocking operations:
import asyncio
from nanasqlite import AsyncNanaSQLite
async def main():
# Use async context manager with optimized thread pool
async with AsyncNanaSQLite("mydata.db", max_workers=10) as db:
# Async dict-like operations
await db.aset("user", {"name": "Nana", "age": 20})
user = await db.aget("user")
print(user) # {'name': 'Nana', 'age': 20}
# Async batch operations
await db.batch_update({
"key1": "value1",
"key2": "value2",
"key3": {"nested": "data"}
})
# Concurrent operations (high-performance with thread pool)
results = await asyncio.gather(
db.aget("key1"),
db.aget("key2"),
db.aget("key3")
)
# Async SQL execution
await db.create_table("users", {
"id": "INTEGER PRIMARY KEY",
"name": "TEXT",
"age": "INTEGER"
})
await db.sql_insert("users", {"name": "Alice", "age": 25})
users = await db.query("users", where="age > ?", parameters=(20,))
asyncio.run(main())
Performance optimizations:
- Dedicated thread pool executor (configurable with
max_workers) - APSW-based for maximum SQLite performance
- WAL mode and connection optimizations
- Ideal for high-concurrency scenarios
Perfect for async frameworks:
- FastAPI, Quart, Sanic (async web frameworks)
- aiohttp (async HTTP client/server)
- Discord.py, Telegram bots (async bots)
- Any asyncio-based application
日本語
🚀 特徴
- dict風インターフェース: おなじみの
db["key"] = value構文で操作 - 即時永続化: 書き込みは即座にSQLiteに保存
- スマートキャッシュ: 遅延ロード(アクセス時)または一括ロード(起動時)
- ネスト構造対応: 30階層以上のネストしたdict/listをサポート
- 高性能: WALモード、mmap、バッチ操作で最高速度を実現
- 設定不要: 合理的なデフォルト設定でそのまま動作
📦 インストール
pip install nanasqlite
⚡ クイックスタート
from nanasqlite import NanaSQLite
# データベースを作成または開く
db = NanaSQLite("mydata.db")
# dictのように使う
db["user"] = {"name": "Nana", "age": 20, "tags": ["admin", "active"]}
print(db["user"]) # {'name': 'Nana', 'age': 20, 'tags': ['admin', 'active']}
# データは自動的に永続化
db.close()
# 後で再度開いても、データはそのまま!
db = NanaSQLite("mydata.db")
print(db["user"]["name"]) # 'Nana'
🔧 高度な使い方
# 一括ロードで繰り返しアクセスを高速化
db = NanaSQLite("mydata.db", bulk_load=True)
# バッチ操作で高速書き込み
db.batch_update({
"key1": "value1",
"key2": "value2",
"key3": {"nested": "data"}
})
# コンテキストマネージャ対応
with NanaSQLite("mydata.db") as db:
db["temp"] = "value"
📚 ドキュメント
✨ 新機能 (v1.0.3rc3+)
Pydantic互換性:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
db.set_model("user", User(name="Nana", age=20))
user = db.get_model("user", User)
直接SQL実行:
# カスタムSQLの実行
cursor = db.execute("SELECT * FROM data WHERE key LIKE ?", ("user%",))
rows = db.fetch_all("SELECT key, value FROM data")
SQLiteラッパー関数:
# テーブルとインデックスを簡単に作成
db.create_table("users", {
"id": "INTEGER PRIMARY KEY",
"name": "TEXT NOT NULL",
"email": "TEXT UNIQUE"
})
db.create_index("idx_users_email", "users", ["email"])
# シンプルなクエリ
results = db.query(table_name="users", where="age > ?", parameters=(20,))
✨ 非同期サポート (v1.0.3rc7+)
高速化されたスレッドプールによる完全な async/await サポート:
import asyncio
from nanasqlite import AsyncNanaSQLite
async def main():
# 最適化されたスレッドプールで非同期コンテキストマネージャを使用
async with AsyncNanaSQLite("mydata.db", max_workers=10) as db:
# 非同期dict風操作
await db.aset("user", {"name": "Nana", "age": 20})
user = await db.aget("user")
print(user) # {'name': 'Nana', 'age': 20}
# 非同期バッチ操作
await db.batch_update({
"key1": "value1",
"key2": "value2",
"key3": {"nested": "data"}
})
# 並行操作(スレッドプールにより高性能)
results = await asyncio.gather(
db.aget("key1"),
db.aget("key2"),
db.aget("key3")
)
# 非同期SQL実行
await db.create_table("users", {
"id": "INTEGER PRIMARY KEY",
"name": "TEXT",
"age": "INTEGER"
})
await db.sql_insert("users", {"name": "Alice", "age": 25})
users = await db.query("users", where="age > ?", parameters=(20,))
asyncio.run(main())
パフォーマンス最適化:
- 専用スレッドプールエグゼキューター(
max_workersで設定可能) - 高性能なAPSWベース
- WALモードと接続最適化
- 高並行性シナリオに最適
非同期フレームワークに最適:
- FastAPI, Quart, Sanic(非同期Webフレームワーク)
- aiohttp(非同期HTTP クライアント/サーバー)
- Discord.py, Telegramボット(非同期ボット)
- あらゆるasyncioベースのアプリケーション
License
MIT License - see LICENSE for details.
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 nanasqlite-1.0.3.tar.gz.
File metadata
- Download URL: nanasqlite-1.0.3.tar.gz
- Upload date:
- Size: 52.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49afcd63fd78d06d5752a3f20a853499dd3120e49b151a2d79889ad9b201f6b4
|
|
| MD5 |
eb2bb637af7298ebc13a14210c83362f
|
|
| BLAKE2b-256 |
8728e76b41f257f2ea5016a0a9901814c5a90bc8eb5c088af1f8a30d18a39120
|
Provenance
The following attestation bundles were made for nanasqlite-1.0.3.tar.gz:
Publisher:
publish.yml on disnana/NanaSQLite
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nanasqlite-1.0.3.tar.gz -
Subject digest:
49afcd63fd78d06d5752a3f20a853499dd3120e49b151a2d79889ad9b201f6b4 - Sigstore transparency entry: 763166417
- Sigstore integration time:
-
Permalink:
disnana/NanaSQLite@bcb7335c81c59f004c9172fad82d443874f9cb79 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/disnana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bcb7335c81c59f004c9172fad82d443874f9cb79 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nanasqlite-1.0.3-py3-none-any.whl.
File metadata
- Download URL: nanasqlite-1.0.3-py3-none-any.whl
- Upload date:
- Size: 25.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fe04b91fca357f92ea6ee689613d5c99d4757fea568cca197fa17f7a8fa882b
|
|
| MD5 |
8b1d5d9089aa823234b51c27413f1056
|
|
| BLAKE2b-256 |
2a9f53b490f61431e36037315ffd2269d4b5afb605cf50b5cfdc6cd5d2a1235c
|
Provenance
The following attestation bundles were made for nanasqlite-1.0.3-py3-none-any.whl:
Publisher:
publish.yml on disnana/NanaSQLite
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nanasqlite-1.0.3-py3-none-any.whl -
Subject digest:
6fe04b91fca357f92ea6ee689613d5c99d4757fea568cca197fa17f7a8fa882b - Sigstore transparency entry: 763166439
- Sigstore integration time:
-
Permalink:
disnana/NanaSQLite@bcb7335c81c59f004c9172fad82d443874f9cb79 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/disnana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bcb7335c81c59f004c9172fad82d443874f9cb79 -
Trigger Event:
push
-
Statement type: