GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Database.html ・ emacs-doc.conao3.com

33.29 データベース

Emacsは、SQLiteデータベースへのアクセス機能を標準で備えてコンパイルできます。本節では、LispプログラムからSQLiteデータベースにアクセスするために利用可能な機能について説明します。

関数: sqlite-available-p

このEmacsセッションでSQLiteの組み込みサポートが利用可能な場合、この関数はnon-nilを返します。

SQLite がサポートされている場合、以下の関数が使用可能です。

関数: sqlite-open &optional file readonly disable-uri

この関数は、file を SQLite データベースファイルとして開きます。file が存在しない場合は、新しいデータベースが作成され、そのファイルに保存されます。file が省略されているか、または nil が指定されている場合は、代わりに新しいインメモリデータベースが作成されます。2番目のオプション引数 readonly が nil 以外の場合、データベースを読み取り専用で開くことを意味します。この場合、データベースが既に存在している必要があります。デフォルトでは、file にはファイル名だけでなく file:// URI も指定可能です。名前が file: で始まるローカルファイルがあるという特殊なケースでは、3番目のオプション引数 disable-uri に nil 以外の値を指定して、URI の自動認識および処理を無効にしてください。

戻り値は、以下で説明する後続の関数のほとんどで引数として使用できるデータベースオブジェクトです。

関数: sqlitep object

この述語は、object が SQLite データベースオブジェクトである場合に non-nil を返します。sqlite-open 関数によって返されるデータベースオブジェクトは、この述語を満たします。

関数: sqlite-close db

データベース db を閉じます。通常、この関数を明示的に呼び出す必要はありません。Emacs が終了するか、データベースオブジェクトがガベージコレクションされると、データベースは自動的に閉じられます。db で指定された接続が既に閉じられている場合、この関数は何もしません。

関数: sqlite-execute db statement &optional values

SQL statement を実行します。例えば:

(sqlite-execute db "insert into foo values ('bar', 2)")

オプションの values パラメータが指定されている場合、それはステートメントの実行時にバインドする値のリストまたはベクトルである必要があります。例えば:

(sqlite-execute db "insert into foo values (?, ?)" '("bar" 2))

これは前述の例と全く同じ効果がありますが、より効率的で安全です(文字列のパースや補間を伴わないため)。

sqlite-execute usually returns the number of affected rows. For instance, an ‘insert’ statement will typically return ‘1’, whereas an ‘update’ statement may return zero or a higher number. However, when using SQL statements like ‘insert into … returning …’ and the like, the values specified by ‘returning …’ will be returned instead.

SQLiteの文字列は、デフォルトではutf-8として格納されており、テキスト列を選択すると、その文字セットを用いて文字列がデコードされます。BLOB列を選択すると、デコードなしで生データが返されます(つまり、データベースに格納されているバイト列を含むユニバイト文字列が返されます)。ただし、BLOB列にバイナリデータを挿入する場合は注意が必要です。デフォルトではsqlite-executeがすべての文字列をutf-8として解釈するためです。

例えば、gif というユニバイト文字列に GIF データが含まれている場合、sqlite-execute にそのことを知らせるために、特別にマークを付ける必要があります:

(put-text-property 0 1 'coding-system 'binary gif)
(sqlite-execute db "insert into foo values (?, ?)" (list gif 2))
関数: sqlite-execute-batch db statements

SQL statements を実行します。 statements は 0 個以上の SQL 文を含む文字列です。 このコマンドは、Lisp プログラムが複数のデータ定義言語 (DDL) 文を一度に実行する必要がある場合に有用です。

関数: sqlite-select db query &optional values return-type

dbから一部のデータを選択して返してください。例えば:

(sqlite-select db "select * from foo where key = 2")
  ⇒ (("bar" 2))

sqlite-executeと同様に、selectの実行前にバインドされる値のリストまたはベクトルを任意で渡すことができます:

(sqlite-select db "select * from foo where key = ?" [2])
  ⇒ (("bar" 2))

これは通常、前の例で用いた方法よりも効率的で安全です。

デフォルトでは、この関数は一致する行のリストを返し、各行は列の値のリストとなります。return-type が full の場合、列名(文字列のリスト)が戻り値の最初の要素として返されます。

return-type が set の場合、この関数は代わりに ステートメントオブジェクト を返します。このオブジェクトは、sqlite-next、sqlite-columns、および sqlite-more-p 関数を使用して調べることができます。結果セットが小さい場合は、単にデータを直接返す方が便利なことが多いですが、結果セットが大きい場合(あるいはセット内のすべてのデータを使用するわけではない場合)は、set メソッドを使用することでメモリ割り当て量を大幅に抑えられ、よりメモリ効率が高くなります。

関数: sqlite-next statement

この関数は、結果セット statement の次の行(通常は sqlite-select によって返されるオブジェクト)を返します。

(sqlite-next stmt)
    ⇒ ("bar" 2)
関数: sqlite-columns statement

この関数は、結果セット statement(通常は sqlite-select によって返されるオブジェクト)の列名を返します。

(sqlite-columns stmt)
    ⇒ ("name" "issue")
関数: sqlite-more-p statement

この述語は、結果セット statement(通常は sqlite-select によって返されるオブジェクト)からさらに取得すべきデータがあるかどうかを示します。

関数: sqlite-finalize statement

statement を今後使用しない場合は、この関数を呼び出すことで statement が使用していたリソースが解放されます。通常、これは不要です。statement オブジェクトがガベージコレクションされる際、Emacs が自動的にそのリソースを解放するためです。

関数: sqlite-transaction db

db でトランザクションを開始します。トランザクション中は、sqlite-commit によってトランザクションがコミットされるまで、データベースの他の読み取り側は結果にアクセスできません。

関数: sqlite-commit db

db でトランザクションを終了し、データをファイルに書き出します。

関数: sqlite-rollback db

db でトランザクションを終了し、そのトランザクションによって行われた変更をすべて破棄します。

マクロ: with-sqlite-transaction db body…

progn と同様(シーケンシング を参照)ですが、トランザクションを保持した状態で body を実行し、body が正常に完了した場合に最後にトランザクションをコミットします。body がエラーを通知した場合、またはトランザクションのコミットに失敗した場合は、body によって行われた db の変更がロールバックされます。マクロが正常に完了し、コミットが成功した場合は、body の値を返します。

関数: sqlite-pragma db pragma

db 内で pragma を実行します。プラグマ は通常、特定のテーブルではなく、データベース全体に影響を与えるコマンドです。例えば、SQLite に不要になったデータを自動的にガベージコレクションさせるには、次のように記述します。

(sqlite-pragma db "auto_vacuum = FULL")

この関数は、成功時には non-nil を、プラグマが失敗した場合には nil を返します。多くのプラグマは、データベースが新規で空の状態であるときにのみ発行可能です。

関数: sqlite-load-extension db module

指定された拡張機能 module をデータベース db にロードします。拡張機能は通常共有ライブラリファイルであり、GNU および Unix システムでは .so というファイル名拡張子を持ちます。

関数: sqlite-version

使用しているSQLiteライブラリのバージョンを示す文字列を返します。

SQLiteファイルの内容を一覧表示したい場合は、sqlite-mode-open-fileコマンドを使用できます。これによりsqlite-modeを用いてバッファにポップされ、SQLiteデータベースの内容を確認(および変更)できるようになります。