【问题标题】:Node.js and sqlite, SQLITE_RANGE: bind or column index out of rangeNode.js 和 sqlite、SQLITE_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 似乎匹配。
  • 我仍然无法插入我的数据库。请参阅下面的答案

标签: node.js sqlite coffeescript


【解决方案1】:
  1. 确保参数数量匹配。
  2. 确保所有 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2020-09-26
      相关资源
      最近更新 更多