Exploitation des résultats¶
Renvoi de résultats en ligne¶
La façon la plus répandue d’exploiter des résultats est d’effectuer un rappel complete
à connection.execute()
. Lorsque l’instruction est terminée et que le résultat est prêt à être exploité, le rappel complete
est invoqué avec les lignes de résultat renvoyées en ligne :
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); } } });
Diffusion de résultats¶
Il est également possible d’exploiter un résultat sous forme de flux de lignes. Ceci peut être fait en utilisant la méthode statement.streamRows()
. Ceci retourne un flux Node.js Readable
qui peut être utilisé pour exploiter les lignes lorsqu’elles sont reçues. Pour plus d’informations sur le flux Readable
, reportez-vous à la documentation Node.js.
Par exemple :
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'); });
Traitement des résultats par lots¶
Par défaut, la méthode statement.streamRows()
produit un flux qui inclut chaque ligne dans le résultat. Cependant, si vous voulez seulement exploiter un sous-ensemble du résultat, ou si vous voulez exploiter les lignes de résultat par lots, vous pouvez appeler streamRows()
avec les arguments start
et end
. Lorsque ces options supplémentaires sont spécifiées, seules les lignes de la plage demandée sont diffusées :
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); }); } })
Conversion de type de données¶
Lorsque les lignes de résultats sont produites, le pilote mappe automatiquement les types de données SQL à leurs équivalents JavaScript correspondants. Par exemple, les valeurs de type TIMESTAMP et DATE sont retournées sous la forme d’objets Date JavaScript.
Pour le mappage complet des types de données JavaScript à SQL , reportez-vous au tableau ci-dessous :
Type de données SQL
Type de données JavaScript
Remarques
VARCHAR, CHAR, CHARACTER, STRING, TEXT
Chaîne
INT, INTEGER, BIGINT, SMALLINT
Nombre
C’est le mappage par défaut. Utilisez le paramètre de session JS_TREAT_INTEGER_AS_BIGINT pour mapper à JavaScript Bigint.
NUMBER(précision, échelle), DECIMAL(p, s), NUMERIC(p, s) où
scale
= 0Nombre
C’est le mappage par défaut. Utilisez le paramètre de session JS_TREAT_INTEGER_AS_BIGINT pour mapper à JavaScript Bigint.
NUMBER(précision, échelle), DECIMAL(p, s), NUMERIC(p, s) où
scale
> 0Nombre
FLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REAL
Nombre
TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
Date
Les valeurs TIMESTAMP_NTZ sont renvoyées dans UTC.
DATE
Date
TIME
Chaîne
Notez que le type de données TIME dans SQL n’a pas d’équivalent dans JavaScript. Il est donc mappé à une chaîne JavaScript.
BOOLEAN
Booléen
VARIANT, ARRAY, OBJECT
JSON
Récupérer des types de données entiers en tant que Bigint¶
Par défaut, les colonnes INTEGER Snowflake (y compris BIGINT, NUMBER(p, 0), etc.) sont converties en type de données JavaScript Number. Toutefois, les plus grandes valeurs légales entières de Snowflake sont supérieures aux plus grandes valeurs légales JavaScript. Pour convertir les colonnes INTEGER Snowflake au format JavaScript Bigint, qui peut stocker des valeurs supérieures à JavaScript Number, définissez le paramètre de session JS_TREAT_INTEGER_AS_BIGINT.
Il y a deux façons de définir ce paramètre :
Utilisez l’instruction ALTER SESSION, comme indiqué ci-dessous :
connection.execute( { sqlText: 'ALTER SESSION SET JS_TREAT_INTEGER_AS_BIGINT = TRUE', complete: function ... } );
Spécifiez le paramètre dans les informations de configuration de la connexion :
var connection = snowflake.createConnection( { username: 'fakeusername', password: 'fakepassword', account: 'fakeaccountidentifier', jsTreatIntegerAsBigInt: true } );
Récupération des types de données sous forme de chaînes¶
Lorsque connection.execute()
est appelé, l’option fetchAsString
peut être définie pour forcer tous les nombres ou dates à être retournés sous forme de chaînes. Ceci peut être utilisé pour obtenir les éléments suivants :
Versions formatées des valeurs de type DATE et TIMESTAMP (ou ses variantes).
Versions de chaîne de types numériques SQL qui ne peuvent pas être converties en numéros JavaScript sans perte de précision.
Par exemple :
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
}
}
});