NyanSQLite ベストプラクティス
本番環境でNyanSQLiteを効果的に使用するための包括的なガイドです。
パフォーマンス最適化
一括挿入には insert_many を使用する
個別に insert を呼び出すよりも、insert_many を使用して一括で挿入する方が圧倒的に高速です。NyanSQLiteは内部で自動的にトランザクションを使用し、SQLiteの制限に合わせて最適にデータを分割します。
# ✅ ベストプラクティス: 一括挿入
users = [User(id=i, name=f"User{i}") for i in range(1000)]
db.insert_many(users)インデックスの活用
頻繁に検索(query)するフィールドには Indexed[T] アノテーションを付けてください。これにより B-tree インデックスが作成され、検索が高速化されます。
class User(BaseModel):
id: int
username: Indexed[str] # username による検索が高速になります全文検索の適切な使用
大量のテキストデータを検索する場合は、Searchable[str] を使用して FTS5 インデックスを作成してください。通常の LIKE 検索よりも劇的に高速です。
class Article(BaseModel):
title: Searchable[str]
body: Searchable[str]必要な列だけ取得する
モデル全体が不要な一覧画面では select() で列を絞ってください。JSON列の復元とPydanticモデル生成を省けます。
summaries = db.select(Article, ["title"], limit=20)非同期の細かな読み取りをまとめる
1件ずつ多数の get() を待つ場合は、可能なら __in でまとめて取得してください。大量のIDはSQLiteの変数数制限を超えないよう分割します。
async def load_users(db, user_ids):
return await db.query(User, id__in=user_ids)深いページは続き位置から取得する
大きい offset は前の行を読み飛ばすため遅くなります。一意な主キー順の一覧なら、前ページ最後のIDを使います。
first_page = db.query(User, order_by="id", limit=20)
next_page = (
db.query(User, id__gt=first_page[-1].id, order_by="id", limit=20)
if first_page else []
)セキュリティ
自動的なパラメータ化
NyanSQLiteの query, get, delete などのメソッドは、内部でパラメータ化クエリ(プリペアードステートメント)を使用しています。これにより、SQLインジェクション攻撃を自動的に防ぎます。
データの整合性
Pydanticモデルを使用することで、データベースに保存されるデータの型安全性が保証されます。可能な限り詳細な型ヒントとバリデーションルール(Field など)をモデルに定義してください。
運用・メンテナンス
定期的な vacuum
データの削除を繰り返すと、SQLiteのデータベースファイル内に空き領域(断片化)が生じます。定期的に db.vacuum() を実行して、ファイルを最適化しサイズを縮小してください。
バックアップ
SQLiteの VACUUM INTO で、コミット済みデータの一貫したコピーを作成できます。出力先ファイルは存在しない必要があり、トランザクションの外で実行してください。
db.execute_raw("VACUUM INTO ?", ("backup.db",))デザインパターン
モデルの共通化
複数のアプリケーションで同じデータベースを共有する場合、モデル定義を独立したモジュールにまとめ、それを各アプリケーションからインポートするようにしてください。
コンテキストマネージャの使用
常に with 文を使用して NyanSQLite を初期化し、リソースが確実に解放されるようにしてください。
with NyanSQLite("app.db") as db:
db.register(MyModel)
# ... 操作まとめ
- ✅ 大量データの挿入には
insert_manyを使用。 - ✅ 検索頻度の高いフィールドには
Indexedを指定。 - ✅ テキスト検索には
Searchable(FTS5) を活用。 - ✅ 常にコンテキストマネージャでリソース管理。
- ✅ 定期的に
vacuumでデータベースを最適化。