Consumo de resultados¶
Retorno de resultados em linha¶
A maneira mais comum de consumir resultados é passar um retorno de chamada complete
para connection.execute()
. Quando a instrução tiver terminado a execução e o resultado estiver pronto para ser consumido, o retorno de chamada complete
é invocado com as linhas de resultado retornadas em linha:
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); } } });
Transmissão de resultados¶
Também é possível consumir um resultado como um fluxo de linhas. Isto pode ser feito chamando o método statement.streamRows()
; isto retorna um fluxo Node.js Readable
que pode ser usado para consumir linhas conforme elas são recebidas. Para obter mais informações sobre o fluxo Readable
, consulte a documentação do Node.js.
Por exemplo:
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'); });
Processamento em lote de resultados¶
Por padrão, o método statement.streamRows()
produz um fluxo que inclui cada linha do resultado. Entretanto, se você quiser consumir apenas um subconjunto do resultado, ou se quiser consumir linhas de resultados em lotes, pode chamar streamRows()
com argumentos start
e end
. Quando estas opções adicionais são especificadas, apenas as linhas no intervalo solicitado são transmitidas:
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); }); } })
Conversão do tipo de dados¶
Quando linhas de resultados são produzidas, o driver automaticamente mapeia tipos de dados SQL para seus equivalentes JavaScript correspondentes. Por exemplo, os valores do tipo TIMESTAMP e DATE são retornados como objetos de data JavaScript.
Para o mapeamento completo dos tipos de dados JavaScript para SQL, consulte a tabela abaixo:
Tipo de dados SQL
Tipo de dados JavaScript
Notas
VARCHAR, CHAR, CHARACTER, STRING, TEXT
Cadeia de caracteres
INT, INTEGER, BIGINT, SMALLINT
Número
Este é o mapeamento padrão. Use o parâmetro de sessão JS_TREAT_INTEGER_AS_BIGINT para mapear para Bigint JavaScript.
NUMBER(precisão, escala), DECIMAL(p, s), NUMERIC(p, s) onde
scale
= 0Número
Este é o mapeamento padrão. Use o parâmetro de sessão JS_TREAT_INTEGER_AS_BIGINT para mapear para Bigint JavaScript.
NUMBER(precisão, escala), DECIMAL(p, s), NUMERIC(p, s) onde
scale
> 0Número
FLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REAL
Número
TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
Data
Valores TIMESTAMP_NTZ são retornados em UTC.
DATE
Data
TIME
Cadeia de caracteres
O tipo de dados TIME em SQL não tem equivalente em JavaScript, portanto é mapeado para uma cadeia de caracteres JavaScript.
BOOLEAN
Booleano
VARIANT, ARRAY, OBJECT
JSON
Busca de tipos de dados inteiros como Bigint¶
Por padrão, colunas INTEGER do Snowflake (incluindo BIGINT, NUMBER(p, 0), etc.) são convertidas para o tipo de dados Número do JavaScript. No entanto, os maiores valores inteiros legais do Snowflake são maiores do que os maiores valores numéricos legais JavaScript. Para converter as colunas INTEGER do Snowflake em Bigint JavaScript, que pode armazenar valores maiores que Número JavaScript, defina o parâmetro de sessão JS_TREAT_INTEGER_AS_BIGINT.
Há duas maneiras de definir este parâmetro:
Use a instrução ALTER SESSION, como mostrado abaixo:
connection.execute( { sqlText: 'ALTER SESSION SET JS_TREAT_INTEGER_AS_BIGINT = TRUE', complete: function ... } );
Especifique o parâmetro nas informações de configuração da conexão:
var connection = snowflake.createConnection( { username: 'fakeusername', password: 'fakepassword', account: 'fakeaccountidentifier', jsTreatIntegerAsBigInt: true } );
Busca de tipos de dados inteiros como cadeias de caracteres¶
Quando connection.execute()
é chamado, a opção fetchAsString
pode ser definida para forçar todos os números ou datas a serem retornados como cadeias de caracteres. Isto pode ser usado para obter:
Versões formatadas de valores do tipo DATE e TIMESTAMP (ou suas variantes).
Versões de cadeia de caracteres de tipos SQL numéricos que não podem ser convertidas em números JavaScript sem perda de precisão.
Por exemplo:
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
}
}
});