SQLightのJavaScriptターゲット(Node.js v22.5+ / Deno v2.2+)での動作を修正しました。
変更箇所: coerce_blob 関数
問題:
- DenoでBufferが利用できない場合の対応が不足していた
修正:
export function coerce_blob(value) {
// Convert BitArray to Uint8Array/Buffer for Node.js/Deno sqlite
if (value instanceof BitArray) {
// For Deno, Buffer may not be available, use Uint8Array
if (typeof Buffer !== 'undefined') {
return Buffer.from(value.rawBuffer);
} else {
// Deno: return Uint8Array directly
return value.rawBuffer;
}
}
return value;
}理由:
- Denoの
node:sqlite互換APIでもBufferは利用可能だが、フォールバックとしてUint8Arrayを直接返す処理を追加 - Node.jsとDenoの両方で安全に動作するようにした
変更箇所: bind_blob_test 関数
問題:
- Denoの
node:sqlite互換レイヤーは?1という名前付きパラメータ記法をサポートしていない - "column index out of range" エラーが発生
修正前:
pub fn bind_blob_test() {
use conn <- connect()
let assert Ok([#(<<123, 0>>, "blob")]) =
sqlight.query("select ?1, typeof(?1)", conn, [sqlight.blob(<<123, 0>>)], {
use ary <- decode.field(0, decode.bit_array)
use str <- decode.field(1, decode.string)
decode.success(#(ary, str))
})
}修正後:
pub fn bind_blob_test() {
use conn <- connect()
let assert Ok([#(blob_data, type_str)]) =
sqlight.query("select ?, typeof(?)", conn, [sqlight.blob(<<123, 0>>), sqlight.blob(<<123, 0>>)], {
use ary <- decode.field(0, decode.bit_array)
use str <- decode.field(1, decode.string)
decode.success(#(ary, str))
})
should.equal(blob_data, <<123, 0>>)
should.equal(type_str, "blob")
}理由:
?1から?に変更し、各パラメータを個別に渡すように修正- Deno/Node.jsの両方で動作する標準的なパラメータバインディング記法を使用
gleam test --target javascript --runtime deno✅ 20 tests, 0 failures
gleam test --target javascript --runtime node✅ 20 tests, 0 failures
Erlangターゲットではesqlite3のNIFライブラリ(esqlite3_nif.so)が必要です。
エラー:
Failed to load NIF library: '/path/to/build/dev/erlang/esqlite/priv/esqlite3_nif.so:
cannot open shared object file: No such file or directory'
回避策:
- JavaScriptターゲットを使用する(推奨)
- NIFを手動でビルドする:
cd build/dev/erlang/esqlite make compile
ただし、Gleamのビルドプロセスがクリーンすると再度ビルドが必要になる場合があります。
- Node.js: v22.5.0以降(
node:sqliteが実験的機能として利用可能) - Deno: v2.2.0以降(
node:sqlite互換APIが利用可能) - Gleam: 0.32.0以降
- Node.js SQLite documentation: https://nodejs.org/api/sqlite.html
- Deno node compatibility: https://docs.deno.com/runtime/reference/node/
- SQLight repository: https://github.com/lpil/sqlight