2016-06-24 13 views
1

Я использую Knex для сервера, который общается с базой данных MySQL.Knex.js & MySQL: литье целого в логическое для массового выбора

У меня есть операторы выбора, которые потенциально могут возвращать большое количество записей из базы данных. Некоторые из ячеек в этих записях являются логическими, что на самом деле означает, что они являются целыми числами (0 или 1). В JavaScript я нуждаюсь в них как booleans, поэтому я мог бы отправить их в JSON как фактические «истинные» или «ложные» значения вместо «0» и «1». До сих пор единственным решением, которое я нашел, было выполнение результатов запроса через цикл, изменяющий каждую запись tinyint в логическое. Тем не менее, мне было интересно, есть ли способ настроить построитель запросов для автоматического возврата булевых значений для определенных ячеек?

ответ

3

OK. После долгих поисков я нашел ответ здесь:

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

Хитрость заключается в том, чтобы настроить подчеркнутый драйвер MySQL, который Knex использует с напечатанный материал объекта:

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

Это не полное решение, поскольку оно не помогает в тех случаях, что boolean (tinyint) может быть NULL. (Я попытался добавить эту опцию к функции кастинга, но она не только испортила результаты в полях tinyint, но и по каким-то причинам перепутала другие ячейки). Итак, если кто-то знает, как учитывать NULL-регистр с булевыми значениями, это будет здорово. Но в любом случае это довольно хорошее решение.

EDIT

Эта функция возвращает 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(); 
} 
+1

Это работает! Обратите внимание, что вы помещаете атрибут 'typeCast' в объект' connection'. – Ties

Смежные вопросы