Skip to content

NyanSQLite API リファレンス

PydanticネイティブなSQLiteラッパー NyanSQLite クラスのドキュメントです。

NyanSQLite

python
class NyanSQLite(path: str = ':memory:', wal: bool = True, strict_deserialization: bool = False)

PydanticネイティブなSQLiteラッパー。

自動的なスキーマ作成、B-treeインデックス、FTS5全文検索、
部分的な読み書き、および高度なクエリ演算子をサポートします。
バックエンドには高速な `apsw` を使用しています。

Pydantic-native SQLite wrapper.
Supports automatic schema creation, B-tree indexes, FTS5 full-text search,
Powered by the high-performance `apsw` backend.

Quick start::

    class Article(BaseModel):
        id:      int
        author:  Indexed[str]
        title:   Searchable[str]
        body:    Searchable[str]
        views:   int = 0

    db = NyanSQLite("blog.sqlite")
    db.register(Article)

    db.insert(Article(id=1, author="neko", title="Hello SQLite", body="…"))
    db.search(Article, "SQLite")
    db.update(Article, where={"id": 1}, views=42)
    db.select(Article, fields=["title", "views"], author="neko")

NyanSQLiteを初期化します。

引数名

引数名説明
pathstrデータベースファイルのパス。デフォルトはメモリ内データベース (":memory:")。
walboolWAL (Write-Ahead Logging) モードを有効にするかどうか。デフォルトは True。
strict_deserializationboolデシリアライズ時に厳密なチェックを行うかどうか。 Trueの場合、不正なデータに対して ValueError を発生させます。 Falseの場合、警告を出して生の値を返します。

コンストラクタ

コアメソッド

register

python
def register(model: type[BaseModel]) -> None

Pydanticモデルを登録し、対応するテーブル、インデックス、FTS5仮想テーブルを作成します。

引数名

引数名説明
modeltype[BaseModel]登録するPydanticモデルクラス。

例外

  • TableNameCollisionError: 同じテーブル名を持つ別のモデルが既に登録されている場合に発生します。

close

python
def close() -> None

基盤となるデータベース接続を閉じます。


registered_models

python
def registered_models() -> list[str]

登録されているすべてのモデル名を取得します。

戻り値

Type: list[str]

list[str]: モデル名のリスト。


CRUD操作

insert

python
def insert(obj: M) -> M

Pydanticモデルのインスタンスをデータベースに挿入します。 Pydanticによる検証後、INSERTします。オブジェクトは変更されずに返されます。

引数名

引数名説明
objM挿入するモデルのインスタンス。

戻り値

Type: M

M: 挿入されたオブジェクト(変更なし)。

例外

  • ModelNotRegisteredError: モデルが登録されていない場合に発生します。

insert_many

python
def insert_many(objs: list[M]) -> int

複数のモデルインスタンスを1つのトランザクションで一括挿入します。

SQLiteの変数バインド制限(デフォルト 32766)を考慮し、大きなデータセットは自動的に分割して挿入されます。 これにより、非常に大きなデータセットでのSQLITE_TOOBIGエラーを防ぎます。

引数名

引数名説明
objslist[M]挿入するモデルインスタンスのリスト。

戻り値

Type: int

int: 挿入された行数。

例外

  • ModelNotRegisteredError: モデルが登録されていない場合に発生します。

update

python
def update(model: type[BaseModel], where: dict[str, Any], **fields: Any) -> int

指定されたフィールドのみを更新する部分更新を行います。

引数名

引数名説明
modeltype[BaseModel]更新対象のモデルクラス。
wheredict[str, Any]更新対象の行を特定する一致条件(例: {"id": 1})。
fields更新する フィールド名=新しい値 のペア。

戻り値

Type: int

int: 更新された行数。

例外

  • ModelNotRegisteredError: モデルが登録されていない場合に発生します。
  • FieldNotFoundError: 指定されたフィールドがモデルに存在しない場合に発生します。

使用例

python
    db.update(User, where={"id": 1}, age=26, bio="updated")

delete

python
def delete(model: type[BaseModel], *filters: str, **kwargs: Any) -> int

フィルタ条件に一致するすべての行を削除します。

引数名

引数名説明
modeltype[BaseModel]削除対象のモデルクラス。
filtersstr文字列形式のフィルタ条件(例: "age > 50")。
kwargsキーワード形式のフィルタ条件(例: id=42)。

戻り値

Type: int

int: 削除された行数。

使用例

python
    db.delete(User, id=42)
    db.delete(User, "age > 50")
    db.delete(Session, user_id=1, active=True)

クエリ & 検索

get

python
def get(model: type[M], *filters: str, **kwargs: Any) -> Optional[M]

条件に一致する最初の行をPydanticモデルとして取得します。一致しない場合は None を返します。

引数名

引数名説明
modeltype[M]取得対象のモデルクラス。
filtersstr文字列形式のフィルタ条件。
kwargsキーワード形式のフィルタ条件。

戻り値

Type: Optional[M]

Optional[M]: 取得されたモデルインスタンス、または None。

使用例

python
    user = db.get(User, id=1)
    user = db.get(User, "age > 30", name="Alice")
    user = db.get(User, email="[email protected]")

query

python
def query(model: type[M], *filters: str, limit: Optional[int] = None, offset: Optional[int] = None, order_by: Optional[str] = None, desc: bool = False, **kwargs: Any) -> list[M]

フィルタリング、ソート、ページネーションを使用して行を検索します。

文字列フィルタおよび演算子サフィックス(__gt, __like など)をサポートしています。

引数名

引数名説明
modeltype[M]検索対象のモデルクラス。
filtersstr文字列形式のフィルタ条件。
limitOptional[int]取得する最大行数。
offsetOptional[int]取得を開始するオフセット行数。
order_byOptional[str]ソートに使用するフィールド名。
descbool降順でソートするかどうか。デフォルトは False(昇順)。 **kwargs (Any): キーワード形式のフィルタ条件。
kwargsキーワード形式のフィルタ条件。

戻り値

Type: list[M]

list[M]: 取得されたモデルインスタンスのリスト。

使用例

python
    db.query(User)                                  # 全ての行
    db.query(User, age=25)                          # 完全一致
    db.query(User, "age > 20", limit=10)            # 文字列フィルタ
    db.query(User, age__gte=20, limit=10)           # 演算子サフィックス
    db.query(User, order_by="name", desc=True)      # ソート
    db.query(User, order_by="id", limit=20, offset=40)  # ページネーション

select

python
def select(model: type[BaseModel], fields: list[str], *filters: str, limit: Optional[int] = None, offset: Optional[int] = None, order_by: Optional[str] = None, desc: bool = False, **kwargs: Any) -> list[dict[str, Any]]

特定のフィールドのみを辞書のリストとして取得します(部分読み込み)。

大きな行を持つテーブルで、未使用の列をロードするのを避けることができます。

引数名

引数名説明
modeltype[BaseModel]取得対象のモデルクラス。
fieldslist[str]取得するフィールド名のリスト。
filtersstr文字列形式のフィルタ条件。
limitOptional[int]取得する最大行数。
offsetOptional[int]オフセット。
order_byOptional[str]ソートに使用するフィールド名。
descbool降順にするかどうか。 **kwargs (Any): キーワード形式のフィルタ条件。
kwargsキーワード形式のフィルタ条件。

戻り値

Type: list[dict[str, Any]]

list[dict[str, Any]]: 指定されたフィールドを含む辞書のリスト。

使用例

python
    db.select(Article, ["title", "views"], author="neko", order_by="views", desc=True)
    db.select(Article, ["title"], "views > 100")

python
def search(model: type[M], query: str, *, limit: Optional[int] = None) -> list[M]

すべての Searchable[str] フィールドに対して全文検索を実行します。

FTS5の MATCH を使用し、BM25アルゴリズムでランク付け(ORDER BY rank)されます。

引数名

引数名説明
modeltype[M]検索対象のモデルクラス。
querystrFTS5検索クエリ文字列。 limit (Optional[int]): 取得する最大行数。
limitOptional[int]取得する最大行数。

戻り値

Type: list[M]

list[M]: 検索結果に一致するモデルインスタンスのリスト(関連度順)。

例外

  • SearchNotEnabledError: モデルに Searchable[str] フィールドが定義されていない場合に発生します。

使用例

python
    db.search(Article, "python sqlite")
    db.search(Article, "python sqlite", limit=5)

フィールドを限定した検索には FTS5 のカラム指定構文が使用できます:

python
    db.search(Article, "title:python")

count

python
def count(model: type[BaseModel], *filters: str, **kwargs: Any) -> int

フィルタ条件に一致する行数を返します。

引数名

引数名説明
modeltype[BaseModel]カウント対象のモデルクラス。
filtersstr文字列フィルタ。
kwargsキーワードフィルタ。

戻り値

Type: int

int: 条件に一致した行数。

使用例

python
    total  = db.count(User)
    adults = db.count(User, "age >= 18")
    adults = db.count(User, age__gte=18)

exists

python
def exists(model: type[BaseModel], *filters: str, **kwargs: Any) -> bool

フィルタ条件に一致する行が少なくとも1つ存在するかどうかを返します。

引数名

引数名説明
modeltype[BaseModel]確認対象のモデルクラス。
filtersstr文字列フィルタ。
kwargsキーワードフィルタ。

戻り値

Type: bool

bool: 存在する場合は True、そうでない場合は False。

使用例

python
    if db.exists(User, email="[email protected]"):
        ...

メンテナンス

rebuild_fts

python
def rebuild_fts(model: type[BaseModel]) -> None

モデルの FTS5 インデックスを再構築します(大量のデータインポート後などに有用です)。

引数名

引数名説明
modeltype[BaseModel]インデックスを再構築するモデルクラス。

vacuum

python
def vacuum() -> None

データベースを VACUUM してディスク領域を解放します。


生のSQL実行

execute_raw

python
def execute_raw(sql: str, params: tuple = ()) -> list[dict[str, Any]]

任意のSQLを実行し、結果を辞書のリストとして返します。

引数名

引数名説明
sqlstr実行するSQL文。
paramstupleSQL文に渡すパラメータ。

戻り値

Type: list[dict[str, Any]]

list[dict[str, Any]]: 結果行のリスト(各行は辞書)。

使用例

python
    db.execute_raw("SELECT count(*) AS n FROM user WHERE age > ?", (18,))

その他のメソッド

atomic

python
def atomic() -> Generator[None, None, None]

トランザクション(ATOMICブロック)を開始します。 ネスト(入れ子)された呼び出しも安全に処理されます。

使用例

python
    with db.atomic():
        db.insert(User(id=1, name="Taro"))
        # ここで例外が発生するとロールバックされます