Node.js和sqlite,SQLITE_RANGE:绑定或列索引超出范围

Loi*_*nen 5 sqlite node.js coffeescript

关于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?
Run Code Online (Sandbox Code Playgroud)

这是我的服务器的输出

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' }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Tad*_*spy 9

显然,您需要做的是确保对象中的键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
Run Code Online (Sandbox Code Playgroud)

它没有很好的记录,但是查看测试用例,您可以看到还有其他选项,例如在它们前面加上@or前缀:。无论如何,您的对象必须与包括前缀在内的占位符匹配。

  • 我还发现,如果对象中有任何额外的属性未映射到查询中的键,那么它会给出相同的“列索引超出范围”错误 (4认同)

Luk*_*zda 3

当您执行以下操作时,应始终指定列列表INSERT

INSERT INTO "user"(login, password_sha, email, token)
VALUES ('ostream',
        'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8',
        'ijw', 'acppn99ngiafw29');

SELECT *
FROM "user"
Run Code Online (Sandbox Code Playgroud)

SqlFiddleDemo

请记住,这user是关键字,应该用引号引起来",或者您可以将表重命名为users.