0

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

  • 他们尊重 INSERT 语句的顺序
  • 他们尊重指定的列类型
  • 他们尊重原始查询中请求的绑定数量

除此之外,我在网上查看过,但找不到解决我问题的方法。以下是尝试的操作的详细信息:

错误:

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);

你能帮我解决这个问题吗?

干杯

4

2 回答 2

2

问题源于 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 版本中可用。

于 2018-03-08T18:35:43.423 回答
1

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

因此,为了提供帮助,我建议您添加.on('query-error'如下所示的 ... 子句,该子句将记录失败的 SQL。很多时候,这会使问题变得显而易见。

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

祝你好运!

于 2018-03-08T03:35:27.677 回答