Inizia qui
Ti servono soltanto un token API GribStream e un client o una libreria compatibile con MySQL.
- Crea un token API gratuito oppure usane uno esistente.
- Usa
gribstreamcome nome utente e il token API come password. - Seleziona un dataset, per esempio
gfs, come database e connettiti.
mysql --host=mysql.gribstream.com \
--port=3307 \
--user=gribstream \
--password \
--database=gfs \
--quick
Il client a riga di comando MySQL richiede il token senza inserirlo nella cronologia della shell. In questo comando, --quick indica al client di stampare le righe appena arrivano invece di attendere il risultato completo. Gli altri client usano impostazioni diverse per i risultati incrementali.
Le query MySQL usano lo stesso token API e la stessa quota delle query API HTTP. L'utilizzo dipende dai dati meteo letti per rispondere alla query. Se non sai quale dataset scegliere, consulta il catalogo dei modelli; gfs è un buon punto di partenza globale.
Perché MySQL?
I linguaggi e gli strumenti dotati di un driver MySQL possono usare questa connessione familiare per interrogare GribStream. Non devi gestire un server MySQL, importare file meteo né imparare una nuova libreria client.
La connessione è di sola lettura e pensata appositamente per i dati meteo. I dataset appaiono come database, i campi meteo sono esplorabili e la sintassi SQL non supportata restituisce un errore chiaro.
Trova una colonna meteo e interrogala
Ogni parametro meteorologico di GribStream appare come una colonna MySQL specifica del dataset. Dopo aver scelto un dataset, esamina le sue colonne prima di scrivere la query:
SHOW FULL COLUMNS FROM gfs.timeseries;
Nel risultato, copia il valore Field che ti serve. Comment indica il nome leggibile, le unità native e l'equivalente esatto con GS_VALUE(...). Per la temperatura GFS a 2 m, la colonna è tmp_2_m_above_ground.
Queste tre forme identificano lo stesso parametro meteorologico. La colonna meteo è la forma SQL più semplice; GS_VALUE è l'alternativa con selettore esatto per tradurre una query esistente dell'API HTTP o scegliere dinamicamente il selettore. La forma JSON è il selettore mostrato nelle pagine dei modelli.
tmp_2_m_above_ground
GS_VALUE
GS_VALUE(
'TMP',
'2 m above ground',
''
)
{
"name": "TMP",
"level": "2 m above ground",
"info": ""
}
Copia i nomi delle colonne meteo da SHOW FULL COLUMNS o gribstream.selector_columns invece di costruirli. La maggior parte è leggibile; i nomi lunghi o in collisione ricevono un suffisso deterministico. I selettori esatti distinguono maiuscole e minuscole.
Questa query restituisce le prossime sei ore di temperatura GFS a 2 m per un punto:
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;
Questa colonna meteo pubblica valori in kelvin. Controlla il suo Comment o il catalogo per conoscere le unità, invece di dedurle dal nome della colonna o dall'alias.
Il risultato è composto da normali righe. I valori seguenti sono illustrativi:
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
Usa il percorso di ricerca nel catalogo per cercare le colonne per nome del parametro, controllare le unità e recuperare il selettore JSON esatto o l'espressione GS_VALUE quando necessario.
Se la connessione ha già selezionato gfs, usa FROM timeseries. Altrimenti specifica la tabella come gfs.timeseries.
Parti da una query funzionante
Scegli l'esempio più vicino al tuo obiettivo, espandilo e modifica solo il dataset, la colonna meteo trovata, i tempi o i luoghi necessari. Copia i nomi da SHOW FULL COLUMNS invece di provare a dedurre come viene normalizzato un selettore.
Interroga più località con nome in un intervallo di 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')
);
Interroga una griglia regolare di latitudine e longitudine
Valori di grid_step più piccoli selezionano più punti e consumano più quota. Parti da un passo ampio e restringi l'area prima di aumentare la risoluzione.
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;
Interroga alcuni tempi di previsione esatti e non contigui
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;
Interroga le previsioni di specifiche esecuzioni del modello
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;
Ricostruisci le previsioni disponibili prima di un limite storico
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;
Interroga membri selezionati di un 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;
Converti un valore e conserva solo le righe che superano una soglia
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;
Trova i punti più caldi della griglia per un tempo di previsione
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;
Connettiti dal tuo linguaggio
Scegli un linguaggio qui sotto. Ogni esempio stabilisce una connessione sicura, esegue la stessa piccola query meteo e ne legge le righe. Conserva il token in una variabile d'ambiente o in un gestore di segreti; non inserirlo mai in una stringa di connessione nel codice.
Client a riga di comando MySQL 8. TLS viene negoziato automaticamente; aggiungi --quick per ricevere il risultato in modo incrementale.
mysql \
-h mysql.gribstream.com -P 3307 \
-u gribstream -p -D gfs \
--quick
Connector/Python tramite SQLAlchemy e pandas. Con chunksize, pandas restituisce un iteratore di DataFrame invece di raccogliere l'intero risultato.
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. La modalità di lettura progressiva usa una dimensione di recupero pari a Integer.MIN_VALUE.
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 per .NET. Il reader consuma le righe in sequenza.
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. L'iterazione con Rows.Next consuma il risultato senza creare uno slice di tutte le righe.
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 callback di mysql2. Lo stream della query rispetta la contropressione di 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());
Il crate Rust mysql. query_iter produce le righe invece di raccogliere un 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 di MySQL. mysql_use_result legge una riga alla volta.
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. Collega GribStream
DuckDB può collegare la connessione tramite l'estensione MySQL e interrogare le colonne meteo come tabelle remote. Inserisci le credenziali nelle normali variabili d'ambiente MYSQL_* e collega il database in sola lettura.
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. Interroga un punto o una griglia regolare
Le normali query sulle tabelle collegate supportano attualmente un punto, come nell'esempio, oppure una griglia regolare definita dai limiti di latitudine e longitudine e da grid_step. Mantieni le condizioni di tempo, posizione e lead time nella query DuckDB affinché possano essere inviate a GribStream prima della restituzione delle righe.
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. Elenca le località con una query grezza
Per richiedere più coordinate separate in una sola volta, passa un'istruzione SQL GribStream supportata alla funzione tabella mysql_query di DuckDB. L'istruzione interna viene eseguita direttamente sulla connessione MySQL e può quindi usare la sintassi GribStream delle tuple di coordinate.
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$);
Per risultati grandi, usa l'iteratore di righe, la modalità streaming o l'equivalente del tuo driver, così non raccoglierà l'intero risultato in memoria.
Scegli timeseries o runs
Ogni schema di dataset espone le stesse due forme di tabella meteo. Scegli la tabella in base alla domanda a cui vuoi rispondere, non alle colonne che vuoi restituire.
timeseries
Sceglila per ottenere la migliore previsione idonea a ogni orario di validità richiesto.
Filtra perforecasted_time
runs
Sceglila per esaminare le previsioni di una o più esecuzioni specifiche del modello.
Filtra perforecasted_atelead_time
forecasted_at è l'orario di inizializzazione del modello. forecasted_time è l'orario di validità della previsione. lead_time è la differenza tra i due in ore e può essere selezionato o filtrato.
Esempio: interroga la cronologia delle esecuzioni del modello
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;
Colonne disponibili, controlli della query e metadati di aggiornamento
| Colonna | Significato | Note |
|---|---|---|
dataset | Codice del dataset che ha prodotto la riga | È anche il nome dello schema MySQL |
forecasted_at | Tempo di inizializzazione del modello | Su timeseries, <= è l'unico operatore supportato per la soglia dell'esecuzione |
forecasted_time | Orario di validità della previsione | Colonna temporale principale per timeseries |
lat, lon, name | Punto risolto ed etichetta facoltativa | name può essere NULL |
member | Identificatore del membro dell'ensemble | Significativo soltanto per i dataset ensemble |
index_updated_at | Ultimo aggiornamento dei dati di origine associato alla riga | Metadato facoltativo di aggiornamento, distinto dai due orari della previsione |
lead_time, grid_step | Lead time della previsione in ore e passo della griglia richiesto in gradi | Selezionabili e filtrabili; grid_step è NULL per i punti elencati |
| Colonne meteo specifiche del dataset | Valori meteorologici nativi, come tmp_2_m_above_ground | Si trovano con SHOW FULL COLUMNS; i valori sono DOUBLE |
Seleziona index_updated_at per vedere l'ultimo aggiornamento dei dati di origine associato a ogni riga. È un metadato di aggiornamento, non il tempo di inizializzazione del modello; usa forecasted_at per identificare l'esecuzione del modello.
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;
Scopri dataset, colonne meteo e selettori esatti
Non indovinare nomi delle colonne, livelli dei parametri o unità. Trova un dataset, esamina le sue colonne meteo e usa la mappatura del selettore esatto solo quando ti serve la forma dell'API o l'alternativa GS_VALUE.
1. Trova un 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;
Controlla copertura e frequenza dell'archivio prima di una grande query storica
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 descrivono la copertura pubblicata; una finestra mobile può avanzare. catalog_updated_at indica quando sono stati aggiornati i metadati del catalogo. Seleziona index_updated_at quando è importante l'aggiornamento a livello di riga.
2. Esplora le colonne meteo
SHOW FULL COLUMNS FROM gfs.timeseries LIKE '%tmp%';
3. Cerca le mappature o usa un selettore esatto
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 associa ogni colonna meteo al nome leggibile, alle unità, al selettore JSON e all'espressione GS_VALUE equivalente. La query richiede una condizione esatta su dataset.
Usa il column_name generato nel normale SQL. Usa GS_VALUE(name, level, info) quando ti serve la traduzione diretta di un selettore dell'API. Questo selettore di gefsatmosmean ha un valore info non vuoto, quindi sono necessari tutti e tre gli argomenti:
{
"name": "CAPE",
"level": "surface",
"info": "ens mean"
}
GS_VALUE(
'CAPE',
'surface',
'ens mean'
)
Le pagine dei modelli continuano a mostrare il selettore JSON canonico e la sua forma esatta con GS_VALUE. Copia i nomi delle colonne SQL dallo schema attivo, dove le collisioni e gli identificatori lunghi sono già stati risolti.
4. Trova segnali confrontabili tra dataset
I parametri condivisi elencano concetti meteo comuni, unità di output e dataset che li supportano. Usa questo catalogo prima di confrontare modelli, poi risolvi la tupla esatta per ogni dataset invece di presumere che i nomi dei selettori coincidano.
SELECT code, label, units, supported_datasets
FROM gribstream.shared_parameters
WHERE code = 'temperature_2m';
Esempio: calcola la velocità del vento a 10 m
Dopo aver trovato i selettori esatti delle componenti del vento a 10 m per ifsoper, combinali con 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;
Sintassi leggibile dalle macchine e comandi di esplorazione MySQL
Usali quando vuoi che la connessione stessa descriva la propria sintassi SQL e gli esempi:
SELECT topic, supported_syntax, example, notes
FROM gribstream.sql_dialect
ORDER BY topic;
SELECT name, description, `sql`
FROM gribstream.query_examples
ORDER BY name;
Sono disponibili anche i comandi MySQL standard SHOW TABLES, SHOW COLUMNS, DESCRIBE e SHOW CREATE TABLE. SHOW FULL COLUMNS include brevi descrizioni meteo e le mappature esatte con GS_VALUE:
SHOW FULL COLUMNS FROM gfs.timeseries;
Tabelle del catalogo
gribstream.datasetsgribstream.parametersgribstream.parameter_variationsgribstream.selector_columnsgribstream.shared_parametersgribstream.sql_dialectandgribstream.query_examples
Le query sui metadati supportano proiezioni o *, DISTINCT, ORDER BY, LIMIT con offset non negativo e combinazioni limitate di =, !=, LIKE, IN e verifiche dei valori nulli.
Valori, calcoli e filtri
Le colonne calcolate usano espressioni SQL familiari e possono fare riferimento agli alias definiti prima nell'elenco di selezione. Assegna prima un alias a una colonna meteo, poi riutilizzalo. Mantieni esplicite le conversioni di unità:
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);
Le condizioni sui valori meteo supportano BETWEEN, IN numerico, verifiche dei valori nulli, parentesi, NOT e combinazioni booleane. Unisci con AND le condizioni su tempo, posizione, lead time, membro ed esecuzione del modello; usa OR soltanto nelle condizioni sui valori meteo.
Funzioni e calcoli più complessi
Le funzioni numeriche più comuni includono ABS, CEIL/CEILING, FLOOR, ROUND, SQRT, POW/POWER, MOD e TRUNCATE. I nomi dei punti supportano LOWER/LCASE, UPPER/UCASE, TRIM e CHAR_LENGTH, che conta i caratteri Unicode. LENGTH di MySQL conta i byte e non è supportato; usa CHAR_LENGTH per i nomi.
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;
Le altre funzioni delle espressioni GribStream usano lo spazio dei nomi esplicito func.. Le espressioni supportano valori letterali, parentesi, operatori unari, aritmetica, confronti e combinazioni booleane. Consulta il riferimento delle espressioni per le chiamate func. registrate e i relativi argomenti.
Unità, tipi di dati e valori mancanti
Le colonne dei parametri meteorologici e GS_VALUE restituiscono le unità native pubblicate nel catalogo; la scelta di un alias non converte il valore. Controlla has_code_table in gribstream.parameters prima di trattare un campo codificato come misura continua.
I valori meteo, le espressioni calcolate, la latitudine e la longitudine vengono restituiti come DOUBLE MySQL. Le colonne timestamp sono DATETIME(6); dataset, nome del punto e identificatori dei membri sono stringhe. I valori numerici o temporali mancanti diventano NULL SQL. Verificali con IS NULL o IS NOT NULL; = NULL non è supportato.
Prepared statement
I normali segnaposto MySQL funzionano nei selettori, nei calcoli, nei timestamp, nelle coordinate, nei membri e nei filtri meteo. Le funzioni di tempo relativo vengono valutate quando il prepared statement viene eseguito, non quando viene preparato.
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;
Risultati DISTINCT limitati
Le query meteo possono usare SELECT DISTINCT ... LIMIT n. L'unicità si applica all'intera riga selezionata. Non può essere combinato con ORDER BY e la query potrebbe dover leggere l'intera selezione limitata prima di sapere che non restano nuove righe. Usalo per eliminare i duplicati da un insieme limitato, non al posto di limiti più stretti per tempo e posizione.
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;
Intervalli di tempo, tempo relativo e fusi orari
timeseries.forecasted_time è l'orario di validità. runs.forecasted_at è l'orario di inizializzazione del modello. Gli intervalli richiedono entrambi i limiti e includono i due estremi quando sono scritti con BETWEEN.
Per finestre adiacenti, preferisci un intervallo semiaperto come forecasted_time >= start AND forecasted_time < end. Evita di restituire due volte l'istante di confine quando si combinano query consecutive.
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;
Funzioni di tempo relativo e formati timestamp supportati
NOW(), CURRENT_TIMESTAMP e UTC_TIMESTAMP() vengono valutati una volta per istruzione in UTC; è accettata la precisione frazionaria, per esempio NOW(6). DATE_ADD, ADDDATE, DATE_SUB, SUBDATE e le forme infisse + INTERVAL/- INTERVAL supportano unità intere fisse dai microsecondi alle settimane. Mesi e anni di calendario sono esclusi intenzionalmente perché la loro durata varia.
I timestamp letterali accettano una data, un datetime MySQL, la forma ISO con T oppure RFC 3339 con offset. Un valore senza offset è UTC, tranne quando rappresenta l'ora locale in ingresso di CONVERT_TZ.
Seleziona tempi esatti e non contigui
Usa = per un tempo esatto e IN per più tempi non contigui. Usa forecasted_time su timeseries e forecasted_at su runs. La raccolta di query contiene un esempio completo.
Interroga un giorno civile locale e gestisci l'ora legale
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;
I fusi IANA con nome tengono conto delle transizioni dell'ora legale. L'intervallo di Parigi qui sopra copre il giorno di 25 ore del ritorno all'ora solare, il 25 ottobre 2026; lo stesso modello semiaperto copre correttamente anche il giorno di 23 ore del passaggio all'ora legale, il 29 marzo. Le ore locali in ingresso vengono convertite subito in UTC; le ore locali ambigue o inesistenti producono un errore chiaro. La conversione del risultato accetta anche forecasted_at e index_updated_at. Mantieni la colonna UTC originale quando il ritorno all'ora solare può mostrare due volte la stessa ora locale. Gli alias di fuso orario proiettati servono solo alla presentazione e non possono essere usati in WHERE.
Le connessioni restano in UTC. SET time_zone accetta valori equivalenti a UTC, SYSTEM o DEFAULT; usa CONVERT_TZ quando ti servono timestamp locali.
Applica un limite storico all'esecuzione del modello
Su timeseries, forecasted_at <= timestamp esclude le esecuzioni del modello più recenti. È l'unico operatore supportato per questa colonna su timeseries; usa index_updated_at quando la domanda riguarda l'aggiornamento dei dati. La raccolta di query contiene un esempio completo con un limite storico.
Punti, griglie, lead time ed ensemble
Usa una coppia di coordinate per un punto, un elenco di tuple per più punti con nome oppure limiti di latitudine e longitudine con grid_step per una griglia regolare. La raccolta di query contiene esempi completi per ogni forma.
- Un punto: usa
lat = value AND lon = value. - Più punti: usa
(lat, lon)o(lat, lon, name)conIN. - Una griglia: limita entrambe le coordinate e imposta
grid_stepin gradi. Passi più piccoli selezionano più punti e consumano più quota.
Filtri per lead time
Usa durate tra virgolette, per esempio lead_time = '24h'. BETWEEN seleziona un intervallo chiuso; confronti accoppiati >=/< esprimono un intervallo semiaperto; un singolo confronto fornisce soltanto un minimo o un massimo. Le stringhe di durata includono forme come '90m', '24h' o '168h'.
Filtri per i membri dell'ensemble
Controlla is_ensemble e l'array JSON members in gribstream.datasets prima di selezionare i membri; non presumere che ogni dataset sia un ensemble o che gli identificatori dei membri abbiano lo stesso intervallo. La raccolta di query contiene un esempio con membri selezionati.
Mantieni efficienti le query
L'utilizzo della quota dipende dai dati meteo letti per valutare una query, non dal numero di righe restituite. Una condizione su un valore meteo o su un alias calcolato, come temp_c > 30, può eliminare righe dal risultato soltanto dopo che i valori sono stati letti. Una query grande può quindi consumare molta quota anche se i filtri sui valori restituiscono pochissime righe.
Le condizioni su tempo di previsione, posizione, lead time e membro dell'ensemble riducono i dati selezionati. Le scelte seguenti hanno l'effetto maggiore:
- Usa
timeseriesa meno che ti serva espressamente la cronologia di più esecuzioni del modello. - Mantieni brevi gli intervalli di tempo oppure usa un elenco di tempi esatti.
- Seleziona soltanto le colonne dei parametri meteorologici necessarie.
- Preferisci punti esatti a una griglia ampia; quando usi una griglia, scegli un
grid_stepadeguato. - Limita il
lead_timee seleziona soltanto i membri dell'ensemble necessari.
Usa l'ordinamento per l'esplorazione
ORDER BY è pensato soprattutto per sessioni interattive ed esplorazione dei dati, quando un risultato subito leggibile giustifica un lavoro aggiuntivo. Per una query limitata, ordinare prima per la colonna temporale principale consente in genere di restituire le righe progressivamente. Usa forecasted_time per timeseries o forecasted_at per runs, scegli una delle due direzioni e aggiungi, se necessario, colonne selezionate o alias come chiavi secondarie.
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;
Per runs, inizia con forecasted_at e limita entrambi gli estremi di lead_time. Se un risultato ordinato è troppo grande per essere elaborato in sicurezza, restringi la selezione oppure rimuovi ORDER BY e ordinalo nell'applicazione.
Per caricamenti storici e altri trasferimenti di dati ad alto volume, ometti ORDER BY. Se l'ordine è importante, ordina i dati dopo averli ricevuti. In questo modo l'ordinamento lato server non limita la velocità, soprattutto quando una selezione ampia è combinata con filtri sui valori meteo.
Classifiche globali
Un ordinamento che inizia da un valore meteo deve considerare l'intera selezione prima di restituire righe, quindi richiede LIMIT. Usa questa forma per le classifiche, non per ricevere risultati incrementali. La raccolta di query contiene un esempio completo dei punti più caldi.
Usa LIMIT per la dimensione del risultato, non per la quota
LIMIT è utile per mantenere piccolo l'output interattivo, ma non definisce la quantità di dati meteo letti. Filtri e ordinamento possono leggere molti più dati di quelli contenuti nel risultato finale. Usa i controlli di selezione qui sopra quando devi ridurre l'utilizzo della quota.
Avanzato: convalida una query con EXPLAIN
La maggior parte delle query non richiede EXPLAIN. Anteponilo a una query meteo per convalidare l'istruzione e vedere informazioni diagnostiche senza recuperare righe meteo né consumare la quota delle query. È utile soprattutto per la risoluzione dei problemi e l'assistenza.
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;
Streaming, annullamento ed errori
Le righe diventano disponibili progressivamente. La loro visualizzazione immediata dipende dal client o dalla libreria MySQL: per query grandi usa l'interfaccia per risultati non bufferizzati, streaming, iterativi o a blocchi. L'impostazione esatta dipende dal client; l'appendice di riferimento dei client rimanda alla documentazione di ogni libreria.
- Disconnessione del client: la chiusura della connessione annulla la query attiva.
- CLI MySQL: premi Ctrl+C per interrompere la query attiva.
Annullamento dall'applicazione e query simultanee
Una connessione MySQL esegue un'istruzione attiva alla volta. Consuma o chiudi il risultato prima di riutilizzare la connessione; usa un pool quando un'applicazione ha davvero bisogno di query simultanee. Ogni connessione del pool si autentica indipendentemente.
Usa l'API di annullamento del driver o un contesto di query annullabile; nome e comportamento dipendono dal client. Per annullare esplicitamente, esegui KILL QUERY <connection_id> da un'altra connessione che usa lo stesso token API. La connessione di destinazione resta riutilizzabile.
Codici di errore MySQL
Gli errori usano le normali risposte di errore MySQL, così i client esistenti li mostrano in modo naturale:
| Situazione | Codice MySQL | Cosa viene mostrato |
|---|---|---|
| Sintassi SQL | 1064 | Un errore di parsing o convalida vicino all'input non supportato. |
| SQL non supportato | 1235 | Una spiegazione precisa del costrutto non supportato. |
| Token non valido | 1045 | Accesso negato durante l'autenticazione della connessione. |
| Query annullata | 1317 | L'esecuzione della query è stata interrotta. |
| Limite di frequenza | 1226 | Il messaggio indica quanto attendere prima di riprovare, quando l'informazione è disponibile. |
Risoluzione dei problemi
Ridurre la larghezza di banda per un risultato grande
Per trasferimenti grandi, abilita la compressione del protocollo MySQL se il client o il driver la supporta. L'impostazione varia in base al client; consulta la documentazione ufficiale nell'appendice.
CLI MySQL: aggiungi --compression-algorithms=zstd alla connessione.
Da qualsiasi client, verifica la compressione negoziata con:
SHOW SESSION STATUS LIKE 'Compression%';
La connessione TLS non supera la verifica del certificato o del nome host
Connettiti a mysql.gribstream.com, non al suo indirizzo IP, e usa un bundle di CA attendibili aggiornato. Mantieni attiva la verifica dell'identità: disabilitarla può nascondere un nome host errato, un'intercettazione o un archivio di attendibilità incompleto. Le impostazioni dell'archivio e della verifica variano in base al client; consulta l'appendice di riferimento dei client.
La connessione scade
Verifica che la rete consenta connessioni TCP in uscita verso mysql.gribstream.com sulla porta 3307. I firewall aziendali e gli ambienti notebook con restrizioni a volte bloccano le porte database non predefinite.
Una colonna meteo è sconosciuta o un selettore esatto viene rifiutato
Esegui SHOW FULL COLUMNS FROM <dataset>.timeseries e copia il valore Field invece di indovinarlo. Per usare un selettore esatto in SQL, copia gs_value_sql da gribstream.selector_columns; i selettori distinguono maiuscole e minuscole e non devono essere tradotti né normalizzati.
Un valore ha scala, unità o significato inattesi
GribStream restituisce i valori nativi pubblicati dal selettore. Ricontrolla units, description e has_code_table nel catalogo e conferma gli esatti level e info. Le conversioni di unità sono colonne calcolate esplicite; un alias AS da solo non modifica mai i dati.
Un intervallo di tempo, un fuso orario o una query ordinata viene rifiutato
Fornisci entrambi i limiti temporali. Converti in UTC i confini espressi nell'ora locale di un fuso con CONVERT_TZ; non indovinare un'ora legale ambigua o inesistente. Per una forma di ordinamento non sicura, restringi la selezione oppure rimuovi ORDER BY e ordina nell'applicazione che riceve i dati.
Non appare alcuna riga fino al termine della query
Il client sta bufferizzando il risultato. Seleziona la modalità non bufferizzata, streaming, iterativa o a blocchi. CLI MySQL: riconnettiti con --quick. pandas: passa chunksize. Per gli altri client, segui la documentazione sulla gestione dei risultati nell'appendice.
Una query riceve l'errore MySQL 1226
Riduci la concorrenza o attendi il tempo indicato nel messaggio di errore prima di riprovare. Un ciclo di tentativi immediati prolunga soltanto il limite di frequenza.
Usa la connessione come strumento autodescrittivo per gli agenti IA
Qualsiasi connettore generico per database MySQL, incluso uno esposto come strumento MCP, può collegarsi a mysql.gribstream.com:3307. Fornisci il token API tramite la configurazione segreta del connettore.
Fornisci all'agente il file di istruzioni qui sotto. Lo schema e le tabelle del catalogo gli consentono di scoprire dataset, colonne meteo, unità, mappature esatte dei selettori, regole del dialetto ed esempi pronti all'uso prima di costruire una query.
- Leggi
gribstream.sql_dialectegribstream.query_examples. - Cerca in
gribstream.datasets, poi eseguiSHOW FULL COLUMNSper la tabella meteo scelta. - Usa
gribstream.selector_columnsquando serve la mappatura a un selettore JSON esatto o aGS_VALUE. - Costruisci ed esegui la query limitata più piccola che risponde alla domanda.
- Usa
EXPLAINsoltanto per convalidare o diagnosticare una query.
Scarica le istruzioni GribStream MySQL per agenti per il flusso di lavoro completo, i limiti della sintassi e le regole per recuperare i dati.
SQL supportato e limiti intenzionali
Query meteo
SELECTdatimeserieseruns- Colonne meteo scoperte e alternative esatte con
GS_VALUE - Alias calcolati, funzioni numeriche e testuali comuni e chiamate
func.documentate - Intervalli ed elenchi di tempi, punti, griglie, membri e lead time
- Filtri booleani sui valori meteo
- Ordinamento a partire dal tempo oppure top-N globale limitato
DISTINCTlimitato, prepared statement e diagnostica facoltativa conEXPLAIN
Non supportato intenzionalmente
- Scritture, DDL, transazioni e blocchi
- Join, sottoquery, aggregazione e raggruppamento
SELECT *per risultati meteo- Ordinamento globale senza limite ed espressioni di ordinamento
- Scostamenti diversi da zero nei risultati meteo
- Funzioni MySQL non elencate e conversioni SQL implicite
Questi limiti mantengono prevedibili le query, incrementali i risultati e chiari gli errori, invece di accettare SQL con comportamenti sorprendenti.
Matrice di compatibilità completa
| Ambito | Forme supportate | Limite |
|---|---|---|
| Sessione | USE, VERSION(), DATABASE(), funzioni temporali UTC, variabili di sessione comuni e verifiche dello stato | Comportamento di compatibilità, non l'insieme completo delle variabili di un server MySQL |
| Esplorazione | SHOW DATABASES, SHOW TABLES, SHOW FULL COLUMNS, DESCRIBE, SHOW CREATE TABLE | Soltanto schemi e tabelle GribStream |
| SELECT sui metadati | Proiezioni o *, DISTINCT, filtri booleani, ORDER BY, LIMIT e offset non negativi | Soltanto tabelle del catalogo e di information_schema |
| SELECT meteo | Colonne fisse e meteo esplicite, alternativa GS_VALUE, calcoli, condizioni limitate, filtri e DISTINCT ristretto | Niente * meteo, join, sottoquery, raggruppamento o aggregazione |
| Ordinamento | Fino a otto chiavi selezionate; ordinamento a partire dal tempo o top-N globale limitato | Niente espressioni, ordinali, chiavi duplicate o ordinamento globale senza limite |
| Prepared statement | Normali segnaposto ? in selettori, espressioni, tempi, posizioni, membri e filtri | Fino a cinque prepared statement per connessione |
| Diagnostica avanzata | EXPLAIN SELECT ... | Convalida senza eseguire; EXPLAIN ANALYZE non è supportato |
| Annullamento | KILL QUERY connection_id da una connessione che usa lo stesso token | Non può ispezionare né annullare il lavoro di un altro token |
Appendice: riferimenti per la configurazione dei client
TLS, compressione, buffering dei risultati, annullamento, timeout e pooling delle connessioni vengono configurati dal client o dal driver, non tramite SQL. Consulta la documentazione della libreria che usi davvero per connetterti.
| Client | Documentazione ufficiale | Utile per |
|---|---|---|
| MySQL CLI | Opzioni del client e opzioni di connessione | TLS, compressione, --quick, timeout e altre opzioni della CLI |
| Python | Argomenti di connessione di Connector/Python e read_sql di pandas | TLS, compressione, pooling, opzioni di connessione e DataFrame a blocchi |
| Java | Proprietà di configurazione di Connector/J | TLS, compressione, timeout e comportamento JDBC |
| C# / .NET | Opzioni di connessione di MySqlConnector | TLS, compressione, pooling e timeout |
| Go | Documentazione di go-sql-driver/mysql | Opzioni DSN, TLS, compressione, timeout e pooling |
| Node.js | Documentazione di mysql2 | Connessioni, TLS, pool, prepared statement e streaming dei risultati |
| Rust | Documentazione del crate mysql | TLS, compressione, pool e iterazione delle righe |
| C | Guida all'API C di MySQL | API di connessione e dei risultati |
| DuckDB | Estensione MySQL di DuckDB | Credenziali nelle variabili d'ambiente, ATTACH in sola lettura, TLS, query su tabelle remote e mysql_query |
| DBeaver | Impostazioni della connessione MySQL e configurazione SSL | Connessione MySQL 8, SSL, attendibilità dei certificati e navigazione del database |
