結果の利用¶
インラインによる結果の返答¶
結果を利用する最も一般的な方法は、 connection.execute()
に complete
コールバックを渡すことです。ステートメントの実行が終了し、結果を使用できる状態になると、 complete
コールバックが呼び出され、結果行がインラインで返されます。
connection.execute({ sqlText: 'SELECT * FROM sometable', complete: function(err, stmt, rows) { if (err) { console.error('Failed to execute statement due to the following error: ' + err.message); } else { console.log('Number of rows produced: ' + rows.length); } } });
結果のストリーミング¶
結果を行のストリームとして使用することもできます。これは、 statement.streamRows()
メソッドを呼び出すことで実行できます。これは、受信した行を使用するために使用できるNode.js Readable
ストリームを返します。 Readable
ストリームの詳細については、 Node.jsのドキュメント をご参照ください。
例:
var statement = connection.execute({ sqlText: 'SELECT * FROM sometable' }); var stream = statement.streamRows(); stream.on('error', function(err) { console.error('Unable to consume all rows'); }); stream.on('data', function(row) { // consume result row... }); stream.on('end', function() { console.log('All rows consumed'); });
結果のバッチ処理¶
デフォルトでは、 statement.streamRows()
メソッドは結果のすべての行を含むストリームを生成します。ただし、結果のサブセットのみを使用する場合、または結果行をバッチで使用する場合は、 start
および end
引数で streamRows()
を呼び出すことができます。これらの追加オプションを指定すると、リクエストされた範囲内の行のみがストリーミングされます。
connection.execute({ sqlText: 'SELECT * FROM sometable', streamResult: true, // prevent rows from being returned inline in the complete callback complete: function(err, stmt, rows) { // no rows returned inline because streamResult was set to true console.log('rows: ' + rows); // 'rows: undefined' // only consume at most the last 5 rows in the result rows = []; stmt.streamRows({ start: Math.max(0, stmt.getNumRows() - 5), end: stmt.getNumRows() - 1, }) .on('error', function(err) { console.error('Unable to consume requested rows'); }) .on('data', function(row) { rows.push(row); }) .on('end', function() { console.log('Number of rows consumed: ' + rows.length); }); } })
データ型のキャスト¶
結果の行が生成されると、ドライバーは対応する JavaScriptSQL 相当物にデータ型を自動的にマッピングします。たとえば、タイプ TIMESTAMP および DATE の値は JavaScript 日付オブジェクトとして返されます。
JavaScript から SQL データ型への完全なマッピングについては、以下のテーブルをご参照ください。
SQL データ型
JavaScript データ型
メモ
VARCHAR, CHAR, CHARACTER, STRING, TEXT
String
INT, INTEGER, BIGINT, SMALLINT
Number
これがデフォルトのマッピングです。セッションパラメーター JS_TREAT_INTEGER_AS_BIGINT を使用して、 JavaScript Bigintにマッピングします。
scale
= 0で、NUMBER(精度、スケール)、 DECIMAL(p、s)、 NUMERIC(p、s)Number
これがデフォルトのマッピングです。セッションパラメーター JS_TREAT_INTEGER_AS_BIGINT を使用して、 JavaScript Bigintにマッピングします。
scale
> 0で、NUMBER(精度、スケール)、 DECIMAL(p、s)、 NUMERIC(p、s)Number
FLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REAL
Number
TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
Date
TIMESTAMP_NTZ 値は UTC に返されます。
DATE
Date
TIME
String
SQL の TIME データ型には JavaScript に相当するものがないため、 JavaScript 文字列にマッピングされます。
BOOLEAN
Boolean
VARIANT, ARRAY, OBJECT
JSON
Bigintとしての整数データ型の取得¶
デフォルトでは、Snowflake INTEGER 列( BIGINT、 NUMBER(p、0)などを含む)は JavaScriptのNumberデータ型に変換されます。ただし、有効なSnowflake整数の最大値は、有効な JavaScript Numberの最大値よりも大きくなります。Snowflakeの INTEGER 列を、 JavaScript Numberより大きな値を保存できる JavaScript Bigintに変換するには、セッションパラメーター JS_TREAT_INTEGER_AS_BIGINTを設定します。
このパラメーターを設定するには次の2つの方法があります。
以下に示すように、ALTER SESSION ステートメントを使用します。
connection.execute( { sqlText: 'ALTER SESSION SET JS_TREAT_INTEGER_AS_BIGINT = TRUE', complete: function ... } );
接続構成情報でパラメーターを指定します。
var connection = snowflake.createConnection( { username: 'fakeusername', password: 'fakepassword', account: 'fakeaccountidentifier', jsTreatIntegerAsBigInt: true } );
文字列としたデータ型のフェッチ¶
connection.execute()
が呼び出されると、 fetchAsString
オプションを設定して、すべての数値または日付を強制的に文字列として返すことができます。これは以下を取得するために使用できます。
タイプ DATE および TIMESTAMP (またはそのバリアント)の値のフォーマットされたバージョン。
精度を損なうことなく JavaScript 数値に変換できない、数値表記の SQL 型の文字列バージョン。
例:
connection.execute({
sqlText: 'SELECT 1.123456789123456789123456789 as "c1"',
fetchAsString: ['Number'],
complete: function(err, stmt, rows) {
if (err) {
console.error('Failed to execute statement due to the following error: ' + err.message);
} else {
console.log('c1: ' + rows[0].c1); // c1: 1.123456789123456789123456789
}
}
});