Knex.js & MySQL:将整数转换为布尔值以实现批量 select
Knex.js & MySQL: Casting Integer into Boolean for bulk select
我将 Knex 用作与 MySQL 数据库通信的服务器。
我有 select 个语句,这些语句可能 return 数据库中的大量记录。这些记录中的一些单元格是布尔值,这实际上意味着它们只是整数(0 或 1)。在 JavaScript 中,我需要它们作为布尔值,因此我可以将它们作为实际 'true' 或 'false' 值而不是“0”和“1”发送到 JSON 中。到目前为止,我找到的唯一解决方案是 运行 通过循环将每个 tinyint 记录更改为布尔值的查询结果。但是,我想知道,有没有办法将查询构建器配置为自动 return 某些单元格的布尔值?
好的。经过大量搜索,我在这里找到了答案:
https://github.com/tgriesser/knex/issues/1240.
诀窍是配置带下划线的 mysql 驱动程序,Knex 使用 typeCast 属性:
var db = require('knex')({
client: 'mysql',
connection: {
host: 'localhost',
user: 'mysql',
password: 'mysql',
database: 'mysql',
typeCast: function(field, next) {
if (field.type == 'TINY' && field.length == 1) {
return (field.string() == '1'); // 1 = true, 0 = false
}
return next();
}
}
});
db('my_table')
.select()
.then((rows) => {
//Each row's boolean field is now true/false instead of 1/0
});
这不是一个完整的解决方案,因为它在布尔 (tinyint) 字段可以为 NULL 的情况下没有帮助。 (我试图将此选项添加到转换函数中,但它不仅弄乱了 tinyint 字段上的结果,而且出于某种原因还弄乱了其他单元格)。所以,如果有人知道如何用布尔值解释 NULL 情况,那就太好了。但无论如何,这是一个相当不错的解决方案。
编辑
当数据库字段为空时,此功能 returns null
。
(field, next) => {
console.log('TypeCasting', field.type, field.length);
if (field.type == 'TINY' && field.length == 1) {
let value = field.string();
return value ? (value == '1') : null;
}
return next();
}
我知道这已经过时了,但您可以将其放入您的 knex 迁移中:
table.boolean(‘is_my_type’).notNullable().defaultTo(false);
它仍将使用 TINYINT,因此您仍可使用转换函数
我将 Knex 用作与 MySQL 数据库通信的服务器。
我有 select 个语句,这些语句可能 return 数据库中的大量记录。这些记录中的一些单元格是布尔值,这实际上意味着它们只是整数(0 或 1)。在 JavaScript 中,我需要它们作为布尔值,因此我可以将它们作为实际 'true' 或 'false' 值而不是“0”和“1”发送到 JSON 中。到目前为止,我找到的唯一解决方案是 运行 通过循环将每个 tinyint 记录更改为布尔值的查询结果。但是,我想知道,有没有办法将查询构建器配置为自动 return 某些单元格的布尔值?
好的。经过大量搜索,我在这里找到了答案:
https://github.com/tgriesser/knex/issues/1240.
诀窍是配置带下划线的 mysql 驱动程序,Knex 使用 typeCast 属性:
var db = require('knex')({
client: 'mysql',
connection: {
host: 'localhost',
user: 'mysql',
password: 'mysql',
database: 'mysql',
typeCast: function(field, next) {
if (field.type == 'TINY' && field.length == 1) {
return (field.string() == '1'); // 1 = true, 0 = false
}
return next();
}
}
});
db('my_table')
.select()
.then((rows) => {
//Each row's boolean field is now true/false instead of 1/0
});
这不是一个完整的解决方案,因为它在布尔 (tinyint) 字段可以为 NULL 的情况下没有帮助。 (我试图将此选项添加到转换函数中,但它不仅弄乱了 tinyint 字段上的结果,而且出于某种原因还弄乱了其他单元格)。所以,如果有人知道如何用布尔值解释 NULL 情况,那就太好了。但无论如何,这是一个相当不错的解决方案。
编辑
当数据库字段为空时,此功能 returns null
。
(field, next) => {
console.log('TypeCasting', field.type, field.length);
if (field.type == 'TINY' && field.length == 1) {
let value = field.string();
return value ? (value == '1') : null;
}
return next();
}
我知道这已经过时了,但您可以将其放入您的 knex 迁移中:
table.boolean(‘is_my_type’).notNullable().defaultTo(false);
它仍将使用 TINYINT,因此您仍可使用转换函数