Open erkannt opened 3 months ago
I was able to narrow this issue down. It seems to occur when I use named placeholders.
This works:
const result = await client.execute({
sql: "SELECT * FROM users WHERE id = ?",
args: [1],
});
This panics:
const result = await client.execute({
sql: "SELECT * FROM users WHERE id = $id",
args: {id: 23},
});
I've tried :@$
as per the docs. All lead to a panic.
I just learned about the same problem here. Also narrowed down to this issue.
I also tried using the npm libsql
package (which is compatible with better-sqlite3 api), and also have the exact same issue.
As I rely heavily in named arguments, I've created a helper to transform from named to positional arguments. Hope it helps anyone who comes to this issue while it's not fixed:
function convertToPositionalParams({sql, args}) {
const paramNames = Object.keys(params);
const positionalParams = [];
const paramMap = {};
// Replace named parameters in the SQL with positional parameters (?)
const transformedSql = sql.replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, paramName) => {
if (paramNames.includes(paramName)) {
if (!(paramName in paramMap)) {
positionalParams.push(params[paramName]);
paramMap[paramName] = positionalParams.length; // Track the index of each parameter
}
return '?';
} else {
throw new Error(`Parameter ${paramName} not found in params object`);
}
});
return {
sql: transformedSql,
args: positionalParams
};
}
In this case, it's using $
as a biding character. But you can change the code to use @
or :
as well inside the regex.
Everything works fine when the client has no
syncUrl
and usesEVENT_DB_SYNC_URL
for theurl
.Using @libsql/client 0.7