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有一个额外提示的限制