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

使用 SQLite3 + Node.js 的最佳实践

sequelize 用于PostgreSQL,MySQL,SQLite和MSSQL的Node.js / io.js ORM

从 Node.js 中的 SQLite 获取表列表

Node.js 说它不能加载 sqlite3 模块,但无论如何