Skip to content

Repository files navigation

NanaRapid

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.6

intは主キー・通常フィールドともに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' -User
NANARAPID_PYTHON=python3.11 bash scripts/install.sh --user

venvへ入れる場合はそのPythonを指定し、-User / --userを省略します。 対応するwheelがdist/にない場合は、指定Pythonで先にbuildしてください。

現在の範囲

  • insert / update / delete / get / get_field / get_many / insert_many
  • Modelと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回連続で実行します。

About

A high-performance embedded database powered by Rust, optimized for fast primary-key and field access with a simple Python API.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages