Node.js 和 sqlite、SQLITE_RANGE:绑定或列索引超出范围
Posted
技术标签:
【中文标题】Node.js 和 sqlite、SQLITE_RANGE:绑定或列索引超出范围【英文标题】:Node.js and sqlite, SQLITE_RANGE: bind or column index out of range 【发布时间】:2016-03-16 02:42:54 【问题描述】:请参阅下面的 MWE 答案!
我知道这听起来很愚蠢,答案可能就在我面前,但我不知道为什么会出现这个 SQLITE_RANGE 错误,因为我的对象看起来具有所需的所有属性。
console.log "values " , values
# Recording in db
console.assert values.login?
console.assert values.password_sha?
console.assert values.email?
console.assert values.token?
values.password = null
@db.run "INSERT INTO user VALUES (NULL, $login, $password_sha, $email, $token)", values, (err) ->
console.error err if err?
这是我的服务器的输出
values login: 'ostream',
email: 'ijw',
password: 'justine',
token: 'acppn99ngiafw29',
password_sha: 'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8'
[Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE'
提前致谢!
【问题讨论】:
尝试指定列INSERT INTO user(col1, col2, col3, col4, col5) VALUES (...)
其中col..
是您的列名。如果第一列是 auto_increment 跳过它并且不设置 NULL
FTR 这是我表的 .schema:CREATE TABLE user (id integer primary key, login text, password_sha text, email text, token text);
lad2025:它似乎有效。为什么我不能直接插入值? .schema 似乎匹配。
我仍然无法插入我的数据库。请参阅下面的答案
【参考方案1】:
-
确保参数数量匹配。
确保所有 SQL 命令的参数名称匹配。
注意 $myValues != $myValue 在我的示例中:
let sqlRequest = "INSERT into myTable (myValue) VALUES ($myValue)";
let sqlParams = $myValues: "Wrong parameter name" ;
this.common.run(sqlRequest, sqlParams);
【讨论】:
【参考方案2】:显然您需要做的是确保您的user
对象中的键以$
为前缀。否则sqlite3
不会将它们识别为占位符的值。试试:
sqlite3 = require 'sqlite3'
db = new sqlite3.Database('testfile.db');
user =
$name: 'hello'
$password: 'jambon'
db.run 'insert into "user" (name, password) VALUES ($name, $password)', user, (err) ->
console.log 'request executed : ', err
没有很好的文档记录,但是查看the test cases 您可以看到还有其他选项,例如在它们前面加上@
或:
。在任何情况下,您的对象都必须匹配包括前缀在内的占位符。
【讨论】:
我还发现,如果对象中有任何额外的属性没有映射到查询中的键,那么它会给出相同的column index out of range
错误【参考方案3】:
INSERT
时应始终指定列列表:
INSERT INTO "user"(login, password_sha, email, token)
VALUES ('ostream',
'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8',
'ijw', 'acppn99ngiafw29');
SELECT *
FROM "user"
SqlFiddleDemo
请记住,user
是关键字,应该用 "
引用,或者您可以将表重命名为 users
。
【讨论】:
以上是关于Node.js 和 sqlite、SQLITE_RANGE:绑定或列索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章
markdown rest-api使用node.js和sqlite3
node.js 上的 Sqlite3 产生 SQLITE_ERROR
sequelize 用于PostgreSQL,MySQL,SQLite和MSSQL的Node.js / io.js ORM