Emacsは、SQLiteデータベースへのアクセス機能を標準で備えてコンパイルできます。本節では、LispプログラムからSQLiteデータベースにアクセスするために利用可能な機能について説明します。
このEmacsセッションでSQLiteの組み込みサポートが利用可能な場合、この関数はnon-nilを返します。
SQLite がサポートされている場合、以下の関数が使用可能です。
この関数は、file を SQLite データベースファイルとして開きます。file が存在しない場合は、新しいデータベースが作成され、そのファイルに保存されます。file が省略されているか、または nil
が指定されている場合は、代わりに新しいインメモリデータベースが作成されます。2番目のオプション引数 readonly が nil
以外の場合、データベースを読み取り専用で開くことを意味します。この場合、データベースが既に存在している必要があります。デフォルトでは、file にはファイル名だけでなく file:// URI
も指定可能です。名前が file:
で始まるローカルファイルがあるという特殊なケースでは、3番目のオプション引数 disable-uri に
nil 以外の値を指定して、URI の自動認識および処理を無効にしてください。
戻り値は、以下で説明する後続の関数のほとんどで引数として使用できるデータベースオブジェクトです。
この述語は、object が SQLite データベースオブジェクトである場合に non-nil を返します。sqlite-open
関数によって返されるデータベースオブジェクトは、この述語を満たします。
データベース db を閉じます。通常、この関数を明示的に呼び出す必要はありません。Emacs が終了するか、データベースオブジェクトがガベージコレクションされると、データベースは自動的に閉じられます。db で指定された接続が既に閉じられている場合、この関数は何もしません。
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))
SQL statements を実行します。 statements は 0 個以上の SQL 文を含む文字列です。 このコマンドは、Lisp プログラムが複数のデータ定義言語 (DDL) 文を一度に実行する必要がある場合に有用です。
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 メソッドを使用することでメモリ割り当て量を大幅に抑えられ、よりメモリ効率が高くなります。
この関数は、結果セット statement の次の行(通常は sqlite-select によって返されるオブジェクト)を返します。
(sqlite-next stmt)
⇒ ("bar" 2)
この関数は、結果セット statement(通常は sqlite-select によって返されるオブジェクト)の列名を返します。
(sqlite-columns stmt)
⇒ ("name" "issue")
この述語は、結果セット statement(通常は sqlite-select によって返されるオブジェクト)からさらに取得すべきデータがあるかどうかを示します。
statement を今後使用しない場合は、この関数を呼び出すことで statement が使用していたリソースが解放されます。通常、これは不要です。statement オブジェクトがガベージコレクションされる際、Emacs が自動的にそのリソースを解放するためです。
db でトランザクションを開始します。トランザクション中は、sqlite-commit
によってトランザクションがコミットされるまで、データベースの他の読み取り側は結果にアクセスできません。
db でトランザクションを終了し、データをファイルに書き出します。
db でトランザクションを終了し、そのトランザクションによって行われた変更をすべて破棄します。
progn と同様(シーケンシング を参照)ですが、トランザクションを保持した状態で body を実行し、body
が正常に完了した場合に最後にトランザクションをコミットします。body
がエラーを通知した場合、またはトランザクションのコミットに失敗した場合は、body によって行われた
db の変更がロールバックされます。マクロが正常に完了し、コミットが成功した場合は、body の値を返します。
db 内で pragma を実行します。プラグマ は通常、特定のテーブルではなく、データベース全体に影響を与えるコマンドです。例えば、SQLite に不要になったデータを自動的にガベージコレクションさせるには、次のように記述します。
(sqlite-pragma db "auto_vacuum = FULL")
この関数は、成功時には non-nil を、プラグマが失敗した場合には nil を返します。多くのプラグマは、データベースが新規で空の状態であるときにのみ発行可能です。
指定された拡張機能 module をデータベース db にロードします。拡張機能は通常共有ライブラリファイルであり、GNU および Unix システムでは .so というファイル名拡張子を持ちます。
使用しているSQLiteライブラリのバージョンを示す文字列を返します。
SQLiteファイルの内容を一覧表示したい場合は、sqlite-mode-open-fileコマンドを使用できます。これによりsqlite-modeを用いてバッファにポップされ、SQLiteデータベースの内容を確認(および変更)できるようになります。