2016-06-24 9 views
1

私は、MySQLデータベースと通信するサーバーにKnexを使用します。Knex.js&MySQL:整数を一括選択のブール値にキャスト

データベースから多数のレコードを返す可能性のあるselect文があります。これらのレコード内のいくつかのセルはブール値であり、実際にはそれらが整数(0または1)であることを意味します。 JavaScriptではbooleanが必要なので、JSONで '0'と '1'の代わりに実際の 'true'または 'false'の値として出荷できます。これまでのところ、見つかった唯一の解決策は、各tinyintレコードをブール値に変更するループを通してクエリの結果を実行することでした。しかし、特定のセルに対してブール値を自動的に返すようにクエリビルダを構成する方法はありますか?

答えて

3

OK。多くの検索の後、私はここで答えを見つけました:

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

トリックは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 
 
    });

それは場合に役立ちませんので、これは完全な解決策ではないこと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

これは機能します。 'connection'オブジェクトに' typeCast'属性を入れてください。 – Ties

関連する問題