A high-performance embedded database for Python, powered by Rust.
型が決まっているレコードを、Pythonから短いAPIで扱うための組み込みDBです。 主キー検索・フィールド取得・Discord IDに紐づく設定データを中心に開発しています。
v1の主要設計を実装した 0.1.0a2 です。 型付きCRUD、Struct、nested field GET、
mmap/AHash、独立したCRC32 redo WAL、世代付きcheckpoint、best-fitによる空き領域再利用を
備えています。配布区分はalphaです。実測と耐久性の検証範囲はドキュメントに記載しています。
from nanarapid import Database, Model, Struct
class Settings(Struct):
threshold: float
enabled: bool
log_channel_id: int
class Guild(Model):
guild_id: int
settings: Settings
with Database("app.nrd") as db:
guilds = db.table(Guild, key="guild_id")
guilds.insert(
guild_id=123456789012345678,
settings={"threshold": 0.6, "enabled": True, "log_channel_id": 987654321098765432},
)
guild = guilds.get(123456789012345678)
assert guild is not None
assert guild.settings.threshold == guild.settings["threshold"]
assert guilds.get_field(guild.guild_id, "settings.threshold") == 0.6intは主キー・通常フィールドともにu64です。負数にはInt64を明示します。
app.nrdはテーブルファイルを入れるディレクトリです。
同じディレクトリで例を繰り返すと重複主キーエラーになります。
Rust 1.90以上、Python 3.10以上とC/C++リンカーが必要です。 WindowsではVisual Studio Build Toolsの「C++によるデスクトップ開発」を使用します。
bash scripts/build.sh
bash scripts/check.sh./scripts/build.ps1
./scripts/check.ps1ビルド用の.venv、開発依存、パッケージのインストール、release wheelを作成します。
ソースを変更した後は、ビルドを再実行してインストール済みパッケージを更新してください。
Pythonを指定する場合は環境変数NANARAPID_PYTHONを設定します。
PyPIへの公開やGit pushは行いません。
ビルドしたwheelを別のPythonへ入れる場合はinstallスクリプトを使います。
./scripts/install.ps1 -Python 'C:\Program Files\Python311\python.exe' -UserNANARAPID_PYTHON=python3.11 bash scripts/install.sh --uservenvへ入れる場合はそのPythonを指定し、-User / --userを省略します。
対応するwheelがdist/にない場合は、指定Pythonで先にbuildしてください。
insert/update/delete/get/get_field/get_many/insert_manyModelとdataclass、固定スキーマのStruct、8段までのネスト- 属性・辞書形式のStruct参照、固定長nested fieldの直接取得
- 型・範囲・UTF-8検証、schema不一致の拒否
- mmap data領域、AHash主キー索引、独立したCRC32 redo WAL
- best-fit、split、隣接空き領域の結合、checkpoint後の旧領域回収とWAL rotation
- RustからModel/Structを直接生成し、中間tupleとPython側の再帰処理を削減
- 排他ファイルロック、プロセス再起動時の索引再構築、不完全な最終frameの切り戻し
WALが既定の16 MiBに達すると同期的にcheckpointします。table.checkpoint()や
db.checkpoint()でも実行でき、明示的なclose時にも行います。バックアップはclose後に
DBディレクトリ全体をコピーしてください。旧alpha形式は元ファイルを保持して自動移行します。
背景compaction、公開snapshot API、テーブル間トランザクション、複数プロセスからの同時アクセスは
提供していません。
電源断に対する実機保証は未検証です。開いているファイルを外部から変更しないでください。
main.pyは既存レコードを保持し、未登録のサンプルIDだけを追加するため、 同じDBで繰り返し実行できます。CIでは既存データがある状態でも2回連続で実行します。