Node.js和sqlite,SQLITE_RANGE:绑定或列索引超出范围
看到我的答案下面的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
时应始终指定列列表:
INSERT INTO "user"(login, password_sha, email, token) VALUES ('ostream', 'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8', 'ijw', 'acppn99ngiafw29'); SELECT * FROM "user"
SqlFiddleDemo
请记住, user
是关键字,应引用"
或者你可以重命名表给users
。
显然你需要做的是确保你的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
这不是很好的文档,但看看testing案例,你可以看到有其他的select,比如用@
或者:
前缀。 在任何情况下,你的对象必须匹配占位符,包括前缀。
我试图做一个testing,我得到了同样的错误:
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
服务器答案:
request executed : { [Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE' }
怎么来的?