Começar
Você só precisa de um token de API do GribStream e de um cliente ou biblioteca compatível com MySQL.
- Crie um token de API gratuito ou use um token existente.
- Use
gribstreamcomo nome de usuário e o token de API como senha. - Escolha um dataset, como
gfs, como banco de dados e conecte-se.
mysql --host=mysql.gribstream.com \
--port=3307 \
--user=gribstream \
--password \
--database=gfs \
--quick
O cliente MySQL de linha de comando solicita o token sem colocá-lo no histórico do shell. Neste comando, --quick faz o cliente imprimir as linhas à medida que chegam, em vez de esperar o resultado completo. Outros clientes usam configurações diferentes para resultados incrementais.
As consultas MySQL usam o mesmo token e a mesma cota das consultas da API HTTP. O uso se baseia nos dados meteorológicos lidos para responder à consulta. Se você não souber qual dataset usar, explore o catálogo de modelos; gfs é um bom ponto de partida global.
Por que MySQL?
Linguagens e ferramentas com um driver MySQL podem usar essa conexão familiar para consultar o GribStream. Você não precisa operar um servidor MySQL, importar arquivos meteorológicos nem aprender uma nova biblioteca.
A conexão é somente leitura e foi criada para dados meteorológicos. Os datasets aparecem como bancos de dados, os campos meteorológicos podem ser explorados e o SQL não compatível retorna um erro claro.
Encontre uma coluna meteorológica e consulte-a
Cada parâmetro meteorológico do GribStream aparece como uma coluna MySQL específica do dataset. Depois de escolher um dataset, consulte as colunas disponíveis antes de escrever a consulta:
SHOW FULL COLUMNS FROM gfs.timeseries;
No resultado, copie o valor de Field de que você precisa. Comment mostra o nome legível, as unidades nativas e o equivalente exato em GS_VALUE(...). Para a temperatura GFS a 2 m, a coluna é tmp_2_m_above_ground.
Estas três formas identificam o mesmo parâmetro meteorológico. A coluna é a forma SQL mais simples; GS_VALUE é a alternativa de seletor exato ao traduzir uma consulta existente da API HTTP ou escolher o seletor dinamicamente. A forma JSON é o seletor mostrado nas páginas dos modelos.
tmp_2_m_above_ground
GS_VALUE
GS_VALUE(
'TMP',
'2 m above ground',
''
)
{
"name": "TMP",
"level": "2 m above ground",
"info": ""
}
Copie os nomes das colunas meteorológicas de SHOW FULL COLUMNS ou gribstream.selector_columns em vez de montá-los. A maioria é legível; nomes longos ou que colidem recebem um sufixo determinístico. Os seletores exatos diferenciam maiúsculas de minúsculas.
Esta consulta retorna as próximas seis horas de temperatura GFS a 2 m para um ponto:
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758
AND lon = -73.985
AND lead_time BETWEEN '0h' AND '48h'
ORDER BY forecasted_time
LIMIT 100;
Esta coluna meteorológica publica valores em kelvin. Consulte seu Comment ou o catálogo para saber as unidades, em vez de deduzi-las pelo nome da coluna ou pelo alias.
O resultado é formado por linhas comuns. Os valores abaixo são ilustrativos:
forecasted_time temp_k
2026-08-07 12:00:00 298.4
2026-08-07 13:00:00 299.1
2026-08-07 14:00:00 299.7
Use o processo de pesquisa no catálogo para procurar colunas pelo nome do parâmetro, verificar as unidades e recuperar o seletor JSON exato ou a expressão GS_VALUE quando necessário.
Se a conexão já selecionou gfs, use FROM timeseries. Caso contrário, qualifique a tabela como gfs.timeseries.
Comece por uma consulta que funciona
Escolha o exemplo mais próximo do seu objetivo, abra-o e altere apenas o dataset, a coluna meteorológica encontrada, os horários ou os locais necessários. Copie os nomes de SHOW FULL COLUMNS em vez de tentar adivinhar como um seletor é normalizado.
Consultar vários locais nomeados em um intervalo de tempo
SELECT forecasted_time, name, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T06:00:00Z'
AND (lat, lon, name) IN (
(40.758, -73.985, 'Times Square'),
(29.7604, -95.3698, 'Houston'),
(51.5072, -0.1276, 'London')
);
Consultar uma grade regular de latitude e longitude
Valores menores de grid_step selecionam mais pontos e consomem mais cota. Comece com um passo maior e restrinja a área antes de aumentar a resolução.
SELECT forecasted_time, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T06:00:00Z'
AND lat BETWEEN 25 AND 50
AND lon BETWEEN -125 AND -66
AND grid_step = 1;
Consultar alguns horários de previsão exatos e não contíguos
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time IN (
'2026-07-13T00:00:00Z',
'2026-07-13T06:00:00Z',
'2026-07-14T18:00:00Z'
)
AND lat = 40.758
AND lon = -73.985;
Consultar previsões de execuções específicas do modelo
SELECT forecasted_at, forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM gfs.runs
WHERE forecasted_at BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND lead_time BETWEEN '0h' AND '48h'
AND lat = 40.758
AND lon = -73.985
ORDER BY forecasted_at, forecasted_time;
Reproduzir as previsões disponíveis antes de um corte histórico
SELECT forecasted_at, forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-14T00:00:00Z'
AND forecasted_at <= '2026-07-12T18:00:00Z'
AND lat = 40.758
AND lon = -73.985
ORDER BY forecasted_time;
Consultar membros selecionados de um ensemble
SELECT forecasted_time, member,
tmp_2_m_above_ground AS temp_k
FROM gefsatmos.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND member IN (0, 1, 2)
AND lead_time BETWEEN '0h' AND '48h'
AND lat = 40.758
AND lon = -73.985;
Converter um valor e manter apenas as linhas que atendem a um limiar
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k,
temp_k - 273.15 AS temp_c
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-14T00:00:00Z'
AND lat = 40.758
AND lon = -73.985
AND temp_c BETWEEN 18 AND 24;
Encontrar os pontos mais quentes de uma grade em um horário de previsão
SELECT forecasted_time, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time = '2026-07-13T18:00:00Z'
AND lat BETWEEN 25 AND 50
AND lon BETWEEN -125 AND -66
AND grid_step = 0.5
ORDER BY temp_k DESC
LIMIT 20;
Conecte-se pela sua linguagem de programação
Escolha uma linguagem de programação abaixo. Cada exemplo estabelece uma conexão segura, executa a mesma pequena consulta meteorológica e lê as linhas. Guarde o token em uma variável de ambiente ou gerenciador de segredos; nunca o coloque em uma string de conexão versionada.
Cliente MySQL 8 de linha de comando. O TLS é negociado automaticamente; adicione --quick para receber a saída de forma incremental.
mysql \
-h mysql.gribstream.com -P 3307 \
-u gribstream -p -D gfs \
--quick
Connector/Python com SQLAlchemy e pandas. Com chunksize, o pandas retorna um iterador de DataFrames em vez de reunir todo o resultado.
import os
import certifi
import pandas as pd
from sqlalchemy import URL, create_engine
url = URL.create(
"mysql+mysqlconnector",
username="gribstream",
password=os.environ["GRIBSTREAM_API_TOKEN"],
host="mysql.gribstream.com",
port=3307,
database="gfs",
)
engine = create_engine(url, connect_args={
"ssl_verify_cert": True,
"ssl_verify_identity": True,
"ssl_ca": certifi.where(),
})
sql = """
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758 AND lon = -73.985
ORDER BY forecasted_time
"""
for frame in pd.read_sql_query(sql, engine, chunksize=10_000):
print(frame.head())
Connector/J. O modo de leitura progressiva usa Integer.MIN_VALUE como tamanho de busca.
String SQL = """
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758 AND lon = -73.985
ORDER BY forecasted_time
""";
String url = "jdbc:mysql://mysql.gribstream.com:3307/gfs?sslMode=VERIFY_IDENTITY";
Properties props = new Properties();
props.setProperty("user", "gribstream");
props.setProperty("password", System.getenv("GRIBSTREAM_API_TOKEN"));
try (Connection db = DriverManager.getConnection(url, props);
Statement statement = db.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY)) {
statement.setFetchSize(Integer.MIN_VALUE);
try (ResultSet rows = statement.executeQuery(SQL)) {
while (rows.next()) {
System.out.println(rows.getTimestamp("forecasted_time"));
}
}
}
MySqlConnector para .NET. O leitor consome as linhas sequencialmente.
const string SQL = @"
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758 AND lon = -73.985
ORDER BY forecasted_time";
var builder = new MySqlConnectionStringBuilder {
Server = "mysql.gribstream.com",
Port = 3307,
Database = "gfs",
UserID = "gribstream",
Password = Environment.GetEnvironmentVariable("GRIBSTREAM_API_TOKEN"),
SslMode = MySqlSslMode.VerifyFull,
};
await using var db = new MySqlConnection(builder.ConnectionString);
await db.OpenAsync();
await using var command = new MySqlCommand(SQL, db);
await using var rows = await command.ExecuteReaderAsync(
CommandBehavior.SequentialAccess);
while (await rows.ReadAsync()) {
Console.WriteLine(rows.GetDateTime("forecasted_time"));
}
go-sql-driver/mysql. Iterar com Rows.Next consome o resultado sem criar um slice com todas as linhas.
const query = `
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758 AND lon = -73.985
ORDER BY forecasted_time`
cfg := mysql.NewConfig()
cfg.User = "gribstream"
cfg.Passwd = os.Getenv("GRIBSTREAM_API_TOKEN")
cfg.Net = "tcp"
cfg.Addr = "mysql.gribstream.com:3307"
cfg.DBName = "gfs"
cfg.TLSConfig = "true"
cfg.ParseTime = true
db, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil { log.Fatal(err) }
defer db.Close()
rows, err := db.QueryContext(ctx, query)
if err != nil { log.Fatal(err) }
defer rows.Close()
for rows.Next() {
var validTime time.Time
var tempK float64
if err := rows.Scan(&validTime, &tempK); err != nil { log.Fatal(err) }
}
API de callbacks do mysql2. O stream da consulta respeita o controle de fluxo do Node.
import mysql from 'mysql2';
const SQL = `
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758 AND lon = -73.985
ORDER BY forecasted_time`;
const db = mysql.createConnection({
host: 'mysql.gribstream.com',
port: 3307,
user: 'gribstream',
password: process.env.GRIBSTREAM_API_TOKEN,
database: 'gfs',
ssl: {},
});
db.query(SQL)
.stream({ highWaterMark: 64 })
.on('data', row => console.log(row.forecasted_time))
.on('error', err => { throw err; })
.on('end', () => db.end());
Crate mysql para Rust. query_iter fornece as linhas sem reuni-las em um Vec.
use mysql::{OptsBuilder, Pool, SslOpts};
use mysql::prelude::Queryable;
let sql = r#"
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND lat = 40.758 AND lon = -73.985
ORDER BY forecasted_time"#;
let opts = OptsBuilder::new()
.ip_or_hostname(Some("mysql.gribstream.com"))
.tcp_port(3307)
.user(Some("gribstream"))
.pass(std::env::var("GRIBSTREAM_API_TOKEN").ok())
.db_name(Some("gfs"))
.ssl_opts(Some(SslOpts::default()));
let pool = Pool::new(opts)?;
let mut db = pool.get_conn()?;
let rows = db.query_iter(sql)?;
for row in rows {
println!("{:?}", row?);
}
API C do MySQL. mysql_use_result lê uma linha por vez.
const char *sql =
"SELECT forecasted_time, "
"tmp_2_m_above_ground AS temp_k "
"FROM timeseries "
"WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR "
"AND lat = 40.758 AND lon = -73.985 "
"ORDER BY forecasted_time";
MYSQL *db = mysql_init(NULL);
unsigned int ssl_mode = SSL_MODE_VERIFY_IDENTITY;
mysql_options(db, MYSQL_OPT_SSL_MODE, &ssl_mode);
mysql_real_connect(db, "mysql.gribstream.com", "gribstream",
getenv("GRIBSTREAM_API_TOKEN"), "gfs", 3307, NULL, 0);
mysql_query(db, sql);
MYSQL_RES *result = mysql_use_result(db);
MYSQL_ROW row;
while ((row = mysql_fetch_row(result)) != NULL) {
printf("%s\n", row[0]);
}
mysql_free_result(result);
mysql_close(db);
1. Anexe o GribStream
O DuckDB pode anexar a conexão por meio da extensão MySQL e consultar as colunas meteorológicas como tabelas remotas. Coloque as credenciais nas variáveis de ambiente MYSQL_* padrão e anexe o banco em modo somente leitura.
export MYSQL_HOST=mysql.gribstream.com
export MYSQL_TCP_PORT=3307
export MYSQL_USER=gribstream
export MYSQL_PWD="$GRIBSTREAM_API_TOKEN"
export MYSQL_DATABASE=gfs
ATTACH 'ssl_mode=verify_identity' AS gribstream_db
(TYPE mysql, READ_ONLY);
2. Consulte um ponto ou uma grade regular
As consultas normais em tabelas anexadas aceitam atualmente um ponto, como no exemplo, ou uma grade regular definida por limites de latitude e longitude e por grid_step. Mantenha as condições de tempo, localização e lead time na consulta do DuckDB para que sejam enviadas ao GribStream antes do retorno das linhas.
SELECT forecasted_time, lead_time, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gribstream_db.gfs.timeseries
WHERE forecasted_time BETWEEN CURRENT_TIMESTAMP
AND CURRENT_TIMESTAMP + INTERVAL 6 HOUR
AND lat = 40.758
AND lon = -73.985
AND lead_time BETWEEN 0 AND 48
LIMIT 100;
3. Enumere locais com uma consulta bruta
Para solicitar várias coordenadas separadas de uma só vez, passe uma instrução SQL compatível com o GribStream pela função de tabela mysql_query do DuckDB. A instrução interna é executada diretamente na conexão MySQL e pode usar a sintaxe de tuplas de coordenadas do GribStream.
SELECT *
FROM mysql_query('gribstream_db', $sql$
SELECT forecasted_time, name, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN NOW() AND NOW() + INTERVAL 6 HOUR
AND (lat, lon, name) IN (
(40.758, -73.985, 'Times Square'),
(29.7604, -95.3698, 'Houston')
)
AND lead_time BETWEEN '0h' AND '48h'
LIMIT 100
$sql$);
Para resultados grandes, use o iterador de linhas, modo streaming ou equivalente do seu driver para evitar que ele mantenha todo o resultado na memória.
Escolha timeseries ou runs
Cada dataset oferece as mesmas duas formas de tabela meteorológica. Escolha a tabela pela pergunta que quer responder, e não pelas colunas que deseja retornar.
timeseries
Escolha esta tabela para obter a melhor previsão elegível em cada horário válido solicitado.
Filtre porforecasted_time
runs
Escolha esta tabela para examinar previsões de uma ou mais execuções específicas do modelo.
Filtre porforecasted_atelead_time
forecasted_at é o horário de inicialização do modelo. forecasted_time é o horário válido previsto. lead_time é a diferença entre eles em horas; pode ser selecionado ou filtrado.
Exemplo: consultar o histórico de execuções do modelo
SELECT forecasted_at, forecasted_time, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.runs
WHERE forecasted_at BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND lead_time BETWEEN '0h' AND '48h'
AND lat = 40.758
AND lon = -73.985
ORDER BY forecasted_at DESC, forecasted_time ASC;
Colunas disponíveis, controles de consulta e metadados de atualização
| Coluna | Significado | Observações |
|---|---|---|
dataset | Código do dataset que produziu a linha | Também é o nome do esquema MySQL |
forecasted_at | Horário de inicialização do modelo | Em timeseries, <= é o único operador aceito para limitar execuções |
forecasted_time | Horário válido previsto | A principal coluna de tempo de timeseries |
lat, lon, name | Ponto resolvido e rótulo opcional | name pode ser NULL |
member | Identificador do membro do ensemble | Relevante apenas para datasets de ensemble |
index_updated_at | Atualização mais recente dos dados de origem associados à linha | Metadado opcional de atualização, diferente dos dois horários da previsão |
lead_time, grid_step | Lead time da previsão em horas e espaçamento solicitado da grade em graus | Podem ser selecionados e filtrados; grid_step é NULL para pontos enumerados |
| Colunas meteorológicas específicas do dataset | Valores meteorológicos nativos, como tmp_2_m_above_ground | Descubra com SHOW FULL COLUMNS; os valores são DOUBLE |
Selecione index_updated_at para ver a atualização mais recente dos dados de origem associados a cada linha. É um metadado de atualização, não o horário de inicialização do modelo; use forecasted_at para identificar a execução.
SELECT forecasted_at, forecasted_time, index_updated_at,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T06:00:00Z'
AND lat = 40.758
AND lon = -73.985
ORDER BY forecasted_time;
Descubra datasets, colunas meteorológicas e seletores exatos
Não adivinhe nomes de colunas, níveis de parâmetros ou unidades. Encontre um dataset, consulte suas colunas meteorológicas e use o mapeamento do seletor exato apenas quando precisar da forma da API ou da alternativa GS_VALUE.
1. Encontre um dataset
SELECT code, full_name, provider, min_lead_time, max_lead_time,
is_ensemble, member_count, members, parameter_count
FROM gribstream.datasets
WHERE code LIKE '%gfs%'
ORDER BY code;
Verifique a cobertura do arquivo e a cadência antes de uma grande consulta histórica
SELECT code, archive_start, archive_window, rolling_window,
time_resolution, run_cadence, min_lead_time, max_lead_time,
catalog_updated_at
FROM gribstream.datasets
WHERE code = 'gfs';
archive_start e archive_window descrevem a cobertura publicada; uma janela móvel pode avançar. catalog_updated_at indica quando os metadados do catálogo foram atualizados. Selecione index_updated_at quando a atualização de cada linha for importante.
2. Explore as colunas meteorológicas
SHOW FULL COLUMNS FROM gfs.timeseries LIKE '%tmp%';
3. Pesquise os mapeamentos ou use um seletor exato
SELECT short_name, full_name, units, has_code_table, variation_count
FROM gribstream.parameters
WHERE dataset = 'gfs'
AND (short_name = 'TMP' OR full_name LIKE '%temperature%')
ORDER BY short_name
LIMIT 20;
SELECT column_name, full_name, units, name, level, info,
selector_json, gs_value_sql
FROM gribstream.selector_columns
WHERE dataset = 'gfs'
AND column_name = 'tmp_2_m_above_ground';
gribstream.selector_columns relaciona cada coluna meteorológica ao nome legível, às unidades, ao seletor JSON e à expressão GS_VALUE equivalente. A consulta exige uma condição exata em dataset.
Use o column_name gerado no SQL habitual. Use GS_VALUE(name, level, info) quando precisar de uma tradução direta de um seletor da API. Este seletor de gefsatmosmean tem um valor info não vazio, portanto exige os três argumentos:
{
"name": "CAPE",
"level": "surface",
"info": "ens mean"
}
GS_VALUE(
'CAPE',
'surface',
'ens mean'
)
As páginas dos modelos continuam mostrando o seletor JSON canônico e sua alternativa exata com GS_VALUE. Copie os nomes das colunas SQL do esquema em uso, onde colisões e identificadores longos já foram resolvidos.
4. Encontre sinais comparáveis entre datasets
Os parâmetros compartilhados listam conceitos meteorológicos comuns, unidades de saída e os datasets compatíveis. Consulte esse catálogo antes de comparar modelos e depois resolva a tupla exata de cada dataset, sem presumir que os seletores têm os mesmos nomes.
SELECT code, label, units, supported_datasets
FROM gribstream.shared_parameters
WHERE code = 'temperature_2m';
Exemplo: calcular a velocidade do vento a 10 m
Depois de encontrar os seletores exatos dos componentes do vento a 10 m para ifsoper, combine-os com func.Hypot:
SELECT forecasted_time,
v_10u_sfc AS u_component,
v_10v_sfc AS v_component,
func.Hypot(u_component, v_component) AS wind_speed
FROM ifsoper.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T06:00:00Z'
AND lat = 48.8566
AND lon = 2.3522
ORDER BY forecasted_time;
Sintaxe legível por máquina e comandos de exploração MySQL
Use estes recursos quando quiser que a própria conexão descreva sua sintaxe SQL e seus exemplos:
SELECT topic, supported_syntax, example, notes
FROM gribstream.sql_dialect
ORDER BY topic;
SELECT name, description, `sql`
FROM gribstream.query_examples
ORDER BY name;
Comandos MySQL comuns, como SHOW TABLES, SHOW COLUMNS, DESCRIBE e SHOW CREATE TABLE, também estão disponíveis. SHOW FULL COLUMNS inclui descrições meteorológicas concisas e os mapeamentos exatos para GS_VALUE:
SHOW FULL COLUMNS FROM gfs.timeseries;
Tabelas do catálogo
gribstream.datasetsgribstream.parametersgribstream.parameter_variationsgribstream.selector_columnsgribstream.shared_parametersgribstream.sql_dialectandgribstream.query_examples
As consultas de metadados aceitam projeções ou *, DISTINCT, ORDER BY, LIMIT com deslocamento não negativo e combinações limitadas de =, !=, LIKE, IN e testes de NULL.
Valores, cálculos e filtros
Colunas calculadas usam expressões SQL familiares e podem fazer referência a aliases definidos anteriormente na lista de seleção. Primeiro atribua um alias a uma coluna meteorológica e depois reutilize-o. Escreva as conversões de unidades de forma explícita:
SELECT forecasted_time,
tmp_2_m_above_ground AS temp_k,
temp_k - 273.15 AS temp_c
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND lat = 40.758
AND lon = -73.985
AND (temp_c BETWEEN 18 AND 30 OR temp_c IS NULL);
Condições sobre valores meteorológicos aceitam BETWEEN, IN numérico, testes de NULL, parênteses, NOT e combinações booleanas. Una com AND as condições de horário, local, lead time, membro e execução do modelo; use OR apenas entre condições sobre valores meteorológicos.
Funções e cálculos mais complexos
As funções numéricas conhecidas incluem ABS, CEIL/CEILING, FLOOR, ROUND, SQRT, POW/POWER, MOD e TRUNCATE. Os nomes dos pontos aceitam LOWER/LCASE, UPPER/UCASE, TRIM e CHAR_LENGTH, que conta caracteres Unicode. O LENGTH do MySQL, que conta bytes, não é compatível; use CHAR_LENGTH para nomes.
SELECT forecasted_time,
ugrd_10_m_above_ground AS u,
vgrd_10_m_above_ground AS v,
func.Hypot(u, v) AS wind_speed
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND lat = 40.758
AND lon = -73.985
AND wind_speed > 5;
Outras funções de expressão do GribStream usam o espaço de nomes explícito func.. As expressões aceitam literais, parênteses, operadores unários, aritmética, comparações e combinações booleanas. Consulte a referência de expressões para ver as chamadas func. registradas e seus argumentos.
Unidades, tipos de dados e valores ausentes
As colunas de parâmetros meteorológicos e GS_VALUE retornam as unidades nativas publicadas no catálogo; escolher um alias não converte o valor. Verifique has_code_table em gribstream.parameters antes de tratar um campo codificado como medida contínua.
Valores meteorológicos, expressões calculadas, latitude e longitude são retornados como DOUBLE do MySQL. As colunas de tempo são DATETIME(6); identificadores de dataset, nome do ponto e membro são strings. Valores numéricos ou temporais ausentes se tornam NULL no SQL. Teste-os com IS NULL ou IS NOT NULL; = NULL não é aceito.
Consultas preparadas
Os marcadores de posição comuns do MySQL funcionam em seletores, cálculos, timestamps, coordenadas, membros e filtros meteorológicos. As funções de tempo relativo são avaliadas quando a consulta preparada é executada, e não quando é preparada.
SELECT forecasted_time AS valid_time,
GS_VALUE(?, ?) AS temp_k,
temp_k - ? AS temp_c
FROM gfs.timeseries
WHERE forecasted_time BETWEEN ? AND ?
AND lat = ?
AND lon = ?
AND temp_c BETWEEN ? AND ?
LIMIT 100;
Resultados DISTINCT limitados
As consultas meteorológicas podem usar SELECT DISTINCT ... LIMIT n. A distinção se aplica à linha selecionada inteira. Ela não pode ser combinada com ORDER BY, e a consulta ainda pode ler toda a seleção limitada antes de saber que não há mais linhas únicas. Use-a para remover duplicatas de um conjunto limitado, não como substituto para restringir tempo e localização.
SELECT DISTINCT name,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T06:00:00Z'
AND (lat, lon, name) IN (
(40.758, -73.985, 'Times Square'),
(29.7604, -95.3698, 'Houston')
)
LIMIT 100;
Intervalos, tempo relativo e fusos horários
timeseries.forecasted_time é o horário válido. runs.forecasted_at é o horário de inicialização do modelo. Intervalos exigem os dois limites e incluem ambas as extremidades quando escritos com BETWEEN.
Para janelas adjacentes, prefira um intervalo semiaberto, como forecasted_time >= start AND forecasted_time < end. Assim, o instante da fronteira não aparece duas vezes quando consultas consecutivas são combinadas.
SELECT forecasted_at, forecasted_time,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN NOW() - INTERVAL 2 DAY AND NOW()
AND forecasted_at <= NOW() - INTERVAL 6 HOUR
AND lat = 40.758
AND lon = -73.985
LIMIT 100;
Funções de tempo relativo e formatos de timestamp aceitos
NOW(), CURRENT_TIMESTAMP e UTC_TIMESTAMP() são avaliados uma vez por consulta em UTC; a precisão fracionária, como NOW(6), é aceita. DATE_ADD, ADDDATE, DATE_SUB, SUBDATE e as formas + INTERVAL/- INTERVAL aceitam unidades inteiras fixas, de microssegundos a semanas. Meses e anos são excluídos porque sua duração varia.
Literais de tempo aceitam uma data, uma data e hora do MySQL, o formato ISO com T ou RFC 3339 com deslocamento de fuso. Um literal sem deslocamento é interpretado como UTC, exceto quando representa o horário local de entrada de CONVERT_TZ.
Selecionar horários exatos e não contíguos
Use = para um horário exato e IN para vários horários não contíguos. Use forecasted_time em timeseries e forecasted_at em runs. Os exemplos de consultas incluem um caso completo.
Consultar um dia local e lidar com o horário de verão
SELECT forecasted_time,
CONVERT_TZ(forecasted_time, 'UTC', 'Europe/Paris') AS paris_time,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time >=
CONVERT_TZ('2026-10-25 00:00:00', 'Europe/Paris', 'UTC')
AND forecasted_time <
CONVERT_TZ('2026-10-26 00:00:00', 'Europe/Paris', 'UTC')
AND lat = 48.8566
AND lon = 2.3522
LIMIT 100;
As zonas IANA nomeadas consideram as mudanças do horário de verão. O intervalo de Paris acima cobre o dia de 25 horas em 25 de outubro de 2026; o mesmo padrão semiaberto cobre corretamente o dia de 23 horas em 29 de março. Horários locais de entrada são convertidos imediatamente para UTC; horários ambíguos ou inexistentes geram um erro claro. A conversão do resultado também aceita forecasted_at e index_updated_at. Mantenha a coluna UTC original quando o mesmo horário local puder aparecer duas vezes. Os aliases das colunas de tempo convertidas servem apenas para apresentação e não podem ser usados em WHERE.
As conexões permanecem em UTC. SET time_zone aceita valores equivalentes a UTC, SYSTEM ou DEFAULT; use CONVERT_TZ quando precisar de timestamps locais.
Aplicar um corte histórico por execução do modelo
Em timeseries, forecasted_at <= timestamp exclui execuções mais recentes. Esse é o único operador aceito para essa coluna em timeseries; use index_updated_at quando a pergunta for sobre a atualização dos dados. Os exemplos de consultas incluem um corte histórico completo.
Pontos, grades, lead times e ensembles
Use um par de coordenadas para um ponto, uma lista de tuplas para vários pontos nomeados ou limites de latitude e longitude com grid_step para uma grade regular. Os exemplos de consultas incluem cada formato.
- Um ponto: use
lat = value AND lon = value. - Vários pontos: use
(lat, lon)ou(lat, lon, name)comIN. - Uma grade: limite as duas coordenadas e defina
grid_stepem graus. Passos menores selecionam mais pontos e consomem mais cota.
Filtros de lead time
Use durações entre aspas, como lead_time = '24h'. BETWEEN seleciona um intervalo fechado; comparações pareadas >=/< expressam um intervalo semiaberto; uma comparação isolada fornece apenas um mínimo ou máximo. As durações aceitam formatos como '90m', '24h' ou '168h'.
Filtros por membro do ensemble
Verifique is_ensemble e o array JSON members em gribstream.datasets antes de selecionar membros; não presuma que todo dataset seja um ensemble nem que os identificadores tenham o mesmo intervalo. Os exemplos de consultas incluem uma seleção de membros.
Mantenha as consultas eficientes
O uso da cota se baseia nos dados meteorológicos lidos para avaliar uma consulta, e não no número de linhas retornadas. Uma condição sobre um valor meteorológico ou alias calculado — como temp_c > 30 — só pode remover linhas depois que esses valores forem lidos. Portanto, uma consulta grande pode consumir muita cota mesmo que os filtros retornem poucas linhas.
Condições sobre horário de previsão, local, lead time e membro do ensemble reduzem os dados selecionados. Estas escolhas têm o maior efeito:
- Use
timeseries, a menos que precise do histórico de várias execuções do modelo. - Mantenha os intervalos curtos ou use uma lista de horários exatos.
- Selecione apenas as colunas de parâmetros meteorológicos necessárias.
- Prefira pontos exatos a uma grade ampla; ao usar uma grade, escolha um
grid_stepadequado. - Limite
lead_timee selecione somente os membros necessários do ensemble.
Use a ordenação para explorar
ORDER BY é destinado principalmente a sessões interativas e exploração de dados, quando vale a pena receber um resultado legível imediatamente. Em uma consulta limitada, começar a ordenação pela principal coluna de tempo geralmente permite receber linhas de forma incremental. Use forecasted_time para timeseries ou forecasted_at para runs, escolha qualquer direção e adicione colunas ou aliases selecionados como chaves secundárias quando necessário.
SELECT forecasted_time AS valid_time, name, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND (lat, lon, name) IN (
(40.758, -73.985, 'Times Square'),
(29.7604, -95.3698, 'Houston'),
(51.5072, -0.1276, 'London')
)
ORDER BY valid_time DESC, temp_k DESC, name ASC;
Para runs, comece por forecasted_at e limite os dois lados de lead_time. Se um resultado ordenado for grande demais para processamento seguro, restrinja a seleção ou remova ORDER BY e ordene na aplicação.
Para cargas históricas e outras extrações de grande volume, omita ORDER BY. Se a ordem for importante, ordene os dados depois de recebê-los. Assim, a ordenação não limita a vazão, principalmente quando uma seleção ampla é combinada com filtros de valores meteorológicos.
Rankings globais
Uma ordenação que começa por um valor meteorológico precisa considerar toda a seleção antes de retornar linhas, portanto exige LIMIT. Use esse formato para rankings, não para saída incremental. Os exemplos de consultas incluem uma consulta completa dos pontos mais quentes.
Use LIMIT para o tamanho do resultado, não para a cota
LIMIT ajuda a manter pequena uma saída interativa, mas não define a quantidade de dados meteorológicos lidos. Filtros e ordenação podem ler muito mais dados do que o resultado final contém. Use os controles de seleção acima quando precisar reduzir o uso da cota.
Avançado: valide uma consulta com EXPLAIN
A maioria das consultas não precisa de EXPLAIN. Coloque-o antes de uma consulta meteorológica para validar a instrução e ver informações de diagnóstico sem buscar linhas nem consumir cota. Ele é útil principalmente para solução de problemas e suporte.
EXPLAIN
SELECT forecasted_time, lat, lon,
tmp_2_m_above_ground AS temp_k
FROM gfs.timeseries
WHERE forecasted_time BETWEEN '2026-07-13T00:00:00Z'
AND '2026-07-13T12:00:00Z'
AND (lat, lon) = (40.758, -73.985)
LIMIT 100;
Resultado incremental, cancelamento e erros
As linhas ficam disponíveis de forma incremental. A exibição imediata depende do cliente ou biblioteca MySQL, portanto use sua interface sem buffer, streaming, iterativa ou em blocos para consultas grandes. A configuração varia por cliente; o apêndice de clientes contém links para a documentação de cada biblioteca.
- Desconexão do cliente: fechar a conexão cancela a consulta ativa.
- Cliente MySQL: pressione Ctrl+C para interromper a consulta ativa.
Cancelamento na aplicação e consultas simultâneas
Uma conexão MySQL tem apenas uma instrução ativa. Consuma ou feche o resultado antes de reutilizar a conexão; use um pool quando a aplicação realmente precisar de consultas simultâneas. Cada conexão do pool se autentica de forma independente.
Use a API de cancelamento ou o contexto cancelável do driver; o nome e o comportamento variam por cliente. Para cancelar explicitamente, execute KILL QUERY <connection_id> em outra conexão com o mesmo token de API. A conexão de destino continua reutilizável.
Códigos de erro MySQL
Os erros usam respostas MySQL comuns para que os clientes existentes os apresentem naturalmente:
| Situação | Código MySQL | Mensagem |
|---|---|---|
| Sintaxe SQL | 1064 | Erro de análise ou validação próximo à entrada não aceita. |
| SQL não compatível | 1235 | Explicação específica da construção não compatível. |
| Token inválido | 1045 | Acesso negado durante a autenticação da conexão. |
| Consulta cancelada | 1317 | A execução da consulta foi interrompida. |
| Limite de uso | 1226 | A mensagem indica quanto tempo esperar antes de tentar novamente, quando essa informação está disponível. |
Solução de problemas
Reduzir a largura de banda de um resultado grande
Para extrações grandes, ative a compressão do protocolo MySQL se o cliente ou driver oferecer suporte. A configuração varia por cliente; consulte a documentação oficial no apêndice.
Cliente MySQL: adicione --compression-algorithms=zstd ao conectar.
Em qualquer cliente, verifique a compressão negociada com:
SHOW SESSION STATUS LIKE 'Compression%';
A conexão TLS não consegue verificar o certificado ou o nome do host
Conecte-se a mysql.gribstream.com, não ao endereço IP, e use uma cadeia de autoridades certificadoras confiáveis e atualizada. Mantenha a verificação de identidade ativa; desativá-la pode ocultar um nome de host incorreto, uma interceptação ou uma cadeia de confiança incompleta. As configurações variam por cliente; consulte o apêndice de clientes.
A conexão excede o tempo limite
Confirme que sua rede permite conexões TCP de saída para mysql.gribstream.com na porta 3307. Firewalls corporativos e alguns ambientes de notebook restritos bloqueiam portas de banco de dados não padrão.
Uma coluna meteorológica é desconhecida ou um seletor exato é rejeitado
Execute SHOW FULL COLUMNS FROM <dataset>.timeseries e copie o valor de Field em vez de adivinhá-lo. Para usar um seletor exato no SQL, copie gs_value_sql de gribstream.selector_columns; os seletores diferenciam maiúsculas de minúsculas e não devem ser traduzidos nem normalizados.
Um valor tem escala, unidade ou significado inesperado
O GribStream retorna os valores nativos publicados do seletor. Confira units, description e has_code_table no catálogo e confirme level e info. Conversões de unidades são colunas calculadas explícitas; um alias AS nunca altera os dados sozinho.
Um intervalo de tempo, fuso horário ou consulta ordenada é rejeitado
Forneça os dois limites de tempo. Converta limites expressos em horário local para UTC com CONVERT_TZ; não tente adivinhar um horário ambíguo ou inexistente durante a mudança de horário. Para uma ordenação insegura, restrinja a seleção ou remova ORDER BY e ordene na aplicação.
Nenhuma linha aparece até a consulta terminar
Seu cliente está acumulando o resultado. Selecione o modo sem buffer, streaming, iterativo ou em blocos. Cliente MySQL: reconecte com --quick. pandas: use chunksize. Para outros clientes, siga a documentação de leitura de resultados no apêndice.
A consulta recebe o erro MySQL 1226
Reduza a simultaneidade ou espere o tempo indicado na mensagem antes de tentar novamente. Tentar imediatamente apenas prolonga o limite.
Use a conexão como ferramenta autodescritiva para agentes de IA
Qualquer conector genérico de banco de dados MySQL — inclusive um exposto como ferramenta MCP — pode se conectar a mysql.gribstream.com:3307. Forneça o token de API pela configuração secreta do conector.
Forneça ao agente o arquivo de instruções abaixo. O esquema e as tabelas do catálogo permitem descobrir datasets, colunas meteorológicas, unidades, mapeamentos exatos de seletores, regras do dialeto e exemplos prontos antes de criar uma consulta.
- Ler
gribstream.sql_dialectegribstream.query_examples. - Pesquisar em
gribstream.datasetse depois consultarSHOW FULL COLUMNSpara a tabela meteorológica escolhida. - Usar
gribstream.selector_columnsquando for necessário mapear um seletor JSON exato ouGS_VALUE. - Criar e executar a menor consulta limitada que responda à pergunta.
- Usar
EXPLAINapenas para validar ou investigar uma consulta.
Baixe as instruções do GribStream MySQL para agentes, com o processo completo, os limites de sintaxe e as regras para obtenção dos dados.
SQL compatível e limites deliberados
Consultas meteorológicas
SELECTemtimeserieseruns- Colunas meteorológicas descobertas e alternativas exatas com
GS_VALUE - Aliases calculados, funções numéricas e de texto conhecidas e chamadas
func.documentadas - Intervalos e listas de tempo, pontos, grades, membros e lead times
- Filtros booleanos sobre valores meteorológicos
- Ordenação começando pelo tempo ou top-N global limitado
DISTINCTlimitado, consultas preparadas e diagnóstico opcional comEXPLAIN
Intencionalmente incompatível
- Escritas, DDL, transações e bloqueios
- Junções, subconsultas, agregação e agrupamento
SELECT *em resultados meteorológicos- Ordenação global ilimitada e expressões de ordenação
- Deslocamentos diferentes de zero em resultados meteorológicos
- Funções MySQL não listadas e coerções SQL implícitas
Esses limites mantêm as consultas previsíveis, permitem resultados incrementais e geram erros claros, em vez de aceitar SQL com comportamento surpreendente.
Matriz de compatibilidade completa
| Área | Formatos compatíveis | Limite |
|---|---|---|
| Sessão | USE, VERSION(), DATABASE(), funções de tempo UTC, variáveis de sessão comuns e verificações de status | Comportamento de compatibilidade, não o conjunto completo de variáveis de um servidor MySQL |
| Exploração | SHOW DATABASES, SHOW TABLES, SHOW FULL COLUMNS, DESCRIBE, SHOW CREATE TABLE | Somente esquemas e tabelas do GribStream |
SELECT de metadados | Projeções ou *, DISTINCT, filtros booleanos, ORDER BY, LIMIT e deslocamentos não negativos | Somente tabelas do catálogo e de information_schema |
SELECT meteorológico | Colunas fixas e meteorológicas explícitas, alternativa GS_VALUE, cálculos, condições limitadas, filtros e DISTINCT restrito | Sem * meteorológico, joins, subconsultas, agrupamento ou agregação |
| Ordenação | Até oito chaves selecionadas; ordenação começando pelo tempo ou top-N global limitado | Sem expressões, posições ordinais, chaves repetidas ou ordenação global ilimitada |
| Consultas preparadas | Placeholders ? comuns em seletores, expressões, horários, locais, membros e filtros | Até cinco consultas preparadas por conexão |
| Diagnóstico avançado | EXPLAIN SELECT ... | Valida sem executar; EXPLAIN ANALYZE não é aceito |
| Cancelamento | KILL QUERY connection_id em uma conexão com o mesmo token | Não é possível inspecionar ou cancelar o trabalho de outro token |
Apêndice: referências de configuração dos clientes
TLS, compressão, buffer de resultados, cancelamento, limites de tempo e pools de conexão são configurados no cliente ou driver, não pelo SQL. Consulte a documentação da biblioteca que você utiliza.
| Cliente | Documentação oficial | Útil para |
|---|---|---|
| MySQL CLI | Opções do cliente e opções de conexão | TLS, compressão, --quick, timeouts e outras opções da linha de comando |
| Python | Argumentos de conexão do Connector/Python e read_sql do pandas | TLS, compressão, pool, opções de conexão e DataFrames em blocos |
| Java | Propriedades de configuração do Connector/J | TLS, compressão, timeouts e comportamento JDBC |
| C# / .NET | Opções de conexão do MySqlConnector | TLS, compressão, pool e timeouts |
| Go | Documentação do go-sql-driver/mysql | Opções de DSN, TLS, compressão, timeouts e pool |
| Node.js | Documentação do mysql2 | Conexões, TLS, pools, consultas preparadas e streaming de resultados |
| Rust | Documentação do crate mysql | TLS, compressão, pools e iteração de linhas |
| C | Guia da API C do MySQL | APIs de conexão e resultado |
| DuckDB | Extensão MySQL do DuckDB | Credenciais em variáveis de ambiente, ATTACH somente leitura, TLS, consultas em tabelas remotas e mysql_query |
| DBeaver | Configurações da conexão MySQL e configuração de SSL | Conexão MySQL 8, SSL, confiança em certificados e navegação no banco |
