Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLITE_范围:INSERT语句的绑定或列超出范围_Sql_Sqlite_Knex.js_Node Sqlite3 - Fatal编程技术网

SQLITE_范围:INSERT语句的绑定或列超出范围

SQLITE_范围:INSERT语句的绑定或列超出范围,sql,sqlite,knex.js,node-sqlite3,Sql,Sqlite,Knex.js,Node Sqlite3,我想使用knex.raw方法将行插入SQLite3表。不幸的是,我得到了一个“SQLITE_RANGE”错误,这使我的测试失败。 我已经按照以下方式验证了传递给原始查询的绑定: 它们尊重INSERT语句的顺序 它们尊重指定的列类型 它们考虑原始查询中请求的绑定数量 除此之外,我在网上查过,但找不到解决问题的方法。以下是尝试的操作的详细信息: 引擎: SQL客户端: 环境: 错误: SQLITE_RANGE: bind or column index out of range errno:

我想使用
knex.raw
方法将行插入SQLite3表。不幸的是,我得到了一个“SQLITE_RANGE”错误,这使我的测试失败。 我已经按照以下方式验证了传递给原始查询的绑定:

  • 它们尊重INSERT语句的顺序
  • 它们尊重指定的列类型
  • 它们考虑原始查询中请求的绑定数量
除此之外,我在网上查过,但找不到解决问题的方法。以下是尝试的操作的详细信息:

  • 引擎
  • SQL客户端
  • 环境
错误:

SQLITE_RANGE: bind or column index out of range errno: 25, code: 'SQLITE_RANGE'
表定义:

-- --------------------------------------------------------

--
-- Table structure for table `ds13odba`
--

CREATE TABLE IF NOT EXISTS `ds13odba` (
  `SURGERY_CODE` VARCHAR(6) ,
  `TYPE` VARCHAR(1) ,
  `FP59STALIB` VARCHAR(6) ,
  `ID` INT UNSIGNED NOT NULL ,
  `createdAt` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
  `updatedAt` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL

);

-- --------------------------------------------------------
*请注意,这里定义的列类型是关联类型,即MySQL类型。这些在SQLite3中有效,并由引擎根据其在SQLite3中的等效项进行浇铸和优化

查询:

INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
绑定:

[ 
  '047202', 1, '000001', 'D',
  '047203', 2, '000002', 'D',
  '047204', 3, '000003', 'D' 
]
呼叫代码:

await knex.raw(...convertToInsertSQL(records));
决议如下:

await knex.raw(insertStatements.join('\n'), bindings);
你能帮我解决这个问题吗


干杯我没有看到您发布的信息有任何明显的错误,但是您没有发布实际的
.raw()
语句,这将有助于调试

因此,为了提供帮助,我建议您添加一个类似下面的
.on('query-error'
..子句,它将记录失败的SQL。很多时候,这会使问题变得明显

knex.raw(...your-stuff...)
    .on('query-error', function(ex, obj) {
        console.log("KNEX-query-error ex:", ex, "obj:", obj);
    })

祝你好运!

我没有看到你发布的信息有任何明显的错误,但是你没有发布实际的
.raw()
语句,这将有助于调试

因此,为了提供帮助,我建议您添加一个类似下面的
.on('query-error'
..子句,它将记录失败的SQL。很多时候,这会使问题变得明显

knex.raw(...your-stuff...)
    .on('query-error', function(ex, obj) {
        console.log("KNEX-query-error ex:", ex, "obj:", obj);
    })

祝你好运!

这个问题源于SQLite3缺乏对每次exec()调用多语句的支持,如文档所述

在我这边进行了一些测试之后,我发现SQLite3引擎将自动将所有绑定分配给准备好的SQL的第一条语句

这仍然适用于事务,因为绑定将应用于“BEGIN TRANSACTION;”语句,而不是以下语句

解决方案是使用带绑定的复合INSERT语句

因此:

INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
变成这样:

INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE)
  VALUES (?,?,?,?), (?,?,?,?), (?,?,?,?);

*请记住,复合INSERT语句仅在SQLite3引擎的3.7.11版之后才可用。

该问题源于SQLite3缺乏对每个exec()调用多语句的支持,如文档所述

在我这边进行了一些测试之后,我发现SQLite3引擎将自动将所有绑定分配给准备好的SQL的第一条语句

这仍然适用于事务,因为绑定将应用于“BEGIN TRANSACTION;”语句,而不是以下语句

解决方案是使用带绑定的复合INSERT语句

因此:

INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE) VALUES (?,?,?,?);
变成这样:

INSERT INTO `ds13odba` (FP59STALIB, ID, SURGERY_CODE, TYPE)
  VALUES (?,?,?,?), (?,?,?,?), (?,?,?,?);

*请记住,复合INSERT语句仅在SQLite3引擎的3.7.11版之后才可用。

感谢您的洞察力,它帮助我从不同的角度看待问题,并且在将来肯定是一个很好的工具:)感谢您的洞察力,它帮助我从不同的角度看待这个问题,并且在将来肯定会是一个很好的工具:)作为一个额外提示,SQLite3有一个额外提示的限制,SQLite3有一个额外提示的限制