Knex.js 和 MySQL:将整数转换为布尔值以进行批量选择

Posted

技术标签:

【中文标题】Knex.js 和 MySQL:将整数转换为布尔值以进行批量选择【英文标题】:Knex.js & MySQL: Casting Integer into Boolean for bulk select 【发布时间】:2016-10-26 12:54:41 【问题描述】:

我将 Knex 用于与 mysql 数据库通信的服务器。

我有可能会从数据库返回大量记录的选择语句。这些记录中的一些单元格是布尔值,这实际上意味着它们只是整数(0 或 1)。在 javascript 中,我需要它们作为布尔值,因此我可以将它们作为实际的“真”或“假”值而不是“0”和“1”发送到 JSON 中。到目前为止,我找到的唯一解决方案是通过将每个 tinyint 记录更改为布尔值的循环来运行查询结果。但是,我想知道,有没有办法将查询生成器配置为自动返回某些单元格的布尔值?

【问题讨论】:

【参考方案1】:

好的。经过大量搜索,我在这里找到了答案:

https://github.com/tgriesser/knex/issues/1240.

诀窍是使用 typeCast 属性配置 Knex 使用的带下划线的 mysql 驱动程序:

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 的情况,那就太好了。但无论如何,这是一个相当不错的解决方案。

编辑

当数据库字段为空时,此函数返回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();

【讨论】:

这行得通!请注意,您将typeCast 属性放在connection 对象中。 我正在使用 MySQL 5.7 并且出于某种原因需要查找 ['LONG', 'TINY'].includes(field.type),即使我的所有字段都是 TINYINT(1)。不知道是什么导致了差异,否则效果很好。【参考方案2】:

我知道这是旧的,但您可以将其放入您的 knex 迁移中:

table.boolean(‘is_my_type’).notNullable().defaultTo(false);

它仍然会使用 TINYINT,所以你仍然可以使用你的投射功能

【讨论】:

以上是关于Knex.js 和 MySQL:将整数转换为布尔值以进行批量选择的主要内容,如果未能解决你的问题,请参考以下文章

将 32 个布尔值的集合转换为 32 位整数 [重复]

将 DataFrame 中的新派生列从布尔值转换为整数

如何将 Postgresql 布尔值转换为 MySQL Tinyint?

将布尔值转换为整数值php

使用“加载文件数据”时将真假字符串转换为布尔值

“将 Tiny 视为布尔值”和实体框架 4