Параметр bind blob в узле-sqlite3

У меня есть таблица SQLite3 с первичным ключом BLOB (id):

CREATE TABLE item (
    id BLOB PRIMARY KEY,
    title VARCHAR(100)
);

В моделях JavaScript первичный ключ (id) представляется в виде строки Javascript (один байт HEX на символ):

var item = { 
    id: "2202D1B511604790922E5A090C81E169",
    title: "foo"
}

Когда я запускаю запрос ниже, id параметр связывается как строка. Но мне нужно, чтобы это было связано как BLOB.

db.run('INSERT INTO item (id, title) VALUES ($id, $title)', {
    $id: item.id,
    $title: item.title
});

Для иллюстрации приведенный выше код генерирует следующий SQL:

INSERT INTO item (id, title) VALUES ("2202D1B511604790922E5A090C81E169", "foo");

Что мне нужно, это:

INSERT INTO item (id, title) VALUES (X'2202D1B511604790922E5A090C81E169', "foo");

2 ответа

Решение

По-видимому, строку необходимо преобразовать в буфер:

db.run('INSERT INTO item (id, title) VALUES ($id, $title)', {
    $id: Buffer.from(item.id, 'hex'),
    $title: item.title
});

Попробуйте привести строку как блоб:

INSERT INTO item(id, title) VALUES(CAST(id_string AS BLOB), 'foo');

Также обратите внимание, что правильный способ заключать строки в кавычки в SQL - это использовать одинарные кавычки.

Другие вопросы по тегам