Accès compatible avec MySQL

Interrogez les données météorologiques avec vos outils habituels

Connectez directement un client ou une bibliothèque MySQL à GribStream. Votre token API sert de mot de passe, les datasets apparaissent comme des bases de données et les données météorologiques sont renvoyées sous forme de lignes MySQL ordinaires.

Bêta publique. Nous ne recommandons pas encore cette connexion pour des charges de travail de production et son comportement peut évoluer pendant la bêta. Vous pouvez signaler un problème ou envoyer vos commentaires par e-mail, ou nous rejoindre sur Discord.
Sur cette page

Commencer

Il vous suffit d’un token API GribStream et d’un client ou d’une bibliothèque compatible avec MySQL.

  1. Créez un token API gratuit ou utilisez un token existant.
  2. Utilisez gribstream comme nom d’utilisateur et le token API comme mot de passe.
  3. Choisissez un dataset, par exemple gfs, comme base de données, puis connectez-vous.
mysql --host=mysql.gribstream.com \
  --port=3307 \
  --user=gribstream \
  --password \
  --database=gfs \
  --quick

Le client MySQL en ligne de commande demande le token sans l’inscrire dans l’historique du shell. Dans cette commande, --quick affiche les lignes à mesure qu’elles arrivent au lieu d’attendre le résultat complet. Les autres clients proposent des réglages différents pour lire les résultats progressivement.

Les requêtes MySQL utilisent le même token API et le même quota que les requêtes de l’API HTTP. L’utilisation dépend des données météorologiques lues pour répondre à la requête. Si vous hésitez sur le dataset, parcourez le catalogue des modèles ; gfs constitue un bon point de départ mondial.

Pourquoi MySQL ?

Les langages et outils équipés d’un pilote MySQL peuvent utiliser cette connexion familière pour interroger GribStream. Vous n’avez pas à exploiter un serveur MySQL, importer des fichiers météorologiques ni apprendre une nouvelle bibliothèque.

La connexion est en lecture seule et conçue pour les données météorologiques. Les datasets apparaissent comme des bases de données, les champs météorologiques peuvent être explorés et le SQL non pris en charge produit une erreur claire.

Utilisez vos outilsTravaillez en ligne de commande, dans une application, un notebook ou une intégration de base de données.
Parcourez le catalogueTrouvez les datasets, champs météorologiques, unités et sélecteurs exacts avant d’interroger les données.
Demandez ce qu’il vous fautChoisissez les heures, les lieux et les valeurs météorologiques à recevoir sous forme de lignes.

Trouver une colonne météo, puis l’interroger

Chaque paramètre météorologique de GribStream apparaît sous la forme d’une colonne MySQL propre au dataset. Après avoir choisi un dataset, consultez ses colonnes avant d’écrire la requête :

SHOW FULL COLUMNS FROM gfs.timeseries;

Dans le résultat, copiez la valeur Field dont vous avez besoin. Comment indique son nom lisible, ses unités natives et son équivalent exact avec GS_VALUE(...). Pour la température GFS à 2 m, la colonne est tmp_2_m_above_ground.

Ces trois formes désignent le même paramètre météorologique. La colonne météo est la forme SQL la plus simple ; GS_VALUE permet de reprendre un sélecteur exact lors de la traduction d’une requête existante de l’API HTTP ou du choix dynamique d’un sélecteur. La forme JSON est celle affichée sur les pages des modèles.

Colonne météo MySQL
tmp_2_m_above_ground
Forme exacte avec GS_VALUE
GS_VALUE(
  'TMP',
  '2 m above ground',
  ''
)
Sélecteur de l’API HTTP
{
  "name": "TMP",
  "level": "2 m above ground",
  "info": ""
}

Copiez les noms des colonnes météo depuis SHOW FULL COLUMNS ou gribstream.selector_columns au lieu de les construire. La plupart sont lisibles ; les noms longs ou en collision reçoivent un suffixe déterministe. Les sélecteurs exacts sont sensibles à la casse.

Cette requête renvoie les six prochaines heures de température GFS à 2 m pour un point :

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;

Cette colonne météo publie ses valeurs en kelvins. Consultez son Comment ou le catalogue pour connaître les unités, sans les déduire du nom de la colonne ou de l’alias.

Le résultat est constitué de lignes ordinaires. Les valeurs suivantes sont données à titre d’exemple :

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

Suivez la procédure de recherche dans le catalogue pour rechercher les colonnes par nom de paramètre, vérifier leurs unités et retrouver le sélecteur JSON exact ou l’expression GS_VALUE lorsque vous en avez besoin.

Si la connexion a déjà sélectionné gfs, utilisez FROM timeseries. Sinon, qualifiez la table avec gfs.timeseries.

Partez d’une requête qui fonctionne

Choisissez l’exemple le plus proche de votre objectif, ouvrez-le et ne modifiez que le dataset, la colonne météo découverte, les heures ou les lieux nécessaires. Copiez les noms depuis SHOW FULL COLUMNS au lieu d’essayer de deviner la normalisation d’un sélecteur.

Interroger plusieurs lieux nommés sur une plage temporelle
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')
      );
Interroger une grille régulière de latitude et de longitude

Une valeur grid_step plus petite sélectionne davantage de points et consomme plus de quota. Commencez avec un pas large et réduisez la zone avant d’augmenter la résolution.

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;
Interroger quelques heures de prévision exactes et non contiguës
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;
Interroger les prévisions de runs de modèle précis
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;
Reproduire les prévisions disponibles avant une date historique
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;
Interroger certains membres d’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;
Convertir une valeur et ne conserver que les lignes respectant un seuil
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;
Trouver les points les plus chauds d’une grille pour une heure de prévision
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;

Se connecter depuis votre langage de programmation

Choisissez un langage de programmation ci-dessous. Chaque exemple établit une connexion sécurisée, exécute la même petite requête météorologique et lit ses lignes. Conservez le token dans une variable d’environnement ou un gestionnaire de secrets ; ne l’enregistrez jamais dans une chaîne de connexion versionnée.

Client MySQL 8 en ligne de commande. TLS est négocié automatiquement ; ajoutez --quick pour obtenir les résultats progressivement.

mysql \
  -h mysql.gribstream.com -P 3307 \
  -u gribstream -p -D gfs \
  --quick

Pour les résultats volumineux, utilisez l’itérateur de lignes, le mode streaming ou l’équivalent de votre pilote afin de ne pas conserver l’ensemble du résultat en mémoire.

Choisir timeseries ou runs

Chaque dataset présente les mêmes deux formes de table météorologique. Choisissez la table en fonction de la question à laquelle vous répondez, et non des colonnes que vous voulez renvoyer.

timeseries

Choisissez cette table pour obtenir la meilleure prévision éligible à chaque heure valide demandée.

Filtrer parforecasted_time

runs

Choisissez cette table pour examiner les prévisions d’un ou plusieurs runs de modèle précis.

Filtrer parforecasted_atetlead_time

forecasted_at est l’heure d’initialisation du modèle. forecasted_time est l’heure de validité prévue. lead_time est leur différence en heures ; cette colonne peut être sélectionnée ou filtrée.

Exemple : consulter l’historique des runs du modèle
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;
Colonnes disponibles, contrôles de requête et métadonnées de mise à jour
ColonneSignificationRemarques
datasetCode du dataset ayant produit la ligneÉgalement le nom du schéma MySQL
forecasted_atHeure d’initialisation du modèleSur timeseries, <= est le seul opérateur accepté pour limiter les runs
forecasted_timeHeure de validité prévueColonne temporelle principale de timeseries
lat, lon, namePoint résolu et étiquette facultativename peut être NULL
memberIdentifiant du membre d’ensembleUtile uniquement pour les datasets d’ensemble
index_updated_atDernière mise à jour des données sources associées à la ligneMétadonnée de mise à jour facultative, distincte des deux heures de prévision
lead_time, grid_stepÉchéance de prévision en heures et espacement demandé de la grille en degrésSélectionnables et filtrables ; grid_step vaut NULL pour des points énumérés
Colonnes météo propres au datasetValeurs météorologiques natives telles que tmp_2_m_above_groundÀ découvrir avec SHOW FULL COLUMNS ; les valeurs sont de type DOUBLE

Sélectionnez index_updated_at pour connaître la dernière mise à jour des données sources associées à chaque ligne. Il s’agit d’une métadonnée de mise à jour, pas de l’heure d’initialisation du modèle ; utilisez forecasted_at pour identifier le run.

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;

Découvrir les datasets, les colonnes météo et les sélecteurs exacts

Ne devinez pas les noms de colonnes, les niveaux de paramètres ni les unités. Trouvez un dataset, consultez ses colonnes météo et n’utilisez la correspondance du sélecteur exact que si vous avez besoin de la forme de l’API ou de la solution de repli GS_VALUE.

1. Trouver 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;
Vérifier la couverture des archives et la cadence avant une requête historique volumineuse
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 et archive_window décrivent la couverture publiée ; une fenêtre glissante peut avancer. catalog_updated_at indique la dernière actualisation des métadonnées du catalogue. Sélectionnez index_updated_at lorsque la mise à jour de chaque ligne est importante.

2. Parcourir ses colonnes météo

SHOW FULL COLUMNS FROM gfs.timeseries LIKE '%tmp%';

3. Rechercher les correspondances ou utiliser un sélecteur exact

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 relie chaque colonne météo à son nom lisible, ses unités, son sélecteur JSON et son expression GS_VALUE équivalente. La requête doit contenir une condition exacte sur dataset.

Utilisez le column_name généré dans les requêtes SQL ordinaires. Employez GS_VALUE(name, level, info) pour traduire directement un sélecteur de l’API. Ce sélecteur de gefsatmosmean possède une valeur info non vide ; les trois arguments sont donc nécessaires :

Sélecteur de paramètre JSON
{
  "name": "CAPE",
  "level": "surface",
  "info": "ens mean"
}
Expression MySQL équivalente
GS_VALUE(
  'CAPE',
  'surface',
  'ens mean'
)

Les pages des modèles continuent d’afficher le sélecteur JSON canonique et sa forme exacte avec GS_VALUE. Copiez les noms des colonnes SQL depuis le schéma en ligne, où les collisions et les identifiants longs sont déjà résolus.

4. Trouver des signaux comparables entre datasets

Les paramètres partagés répertorient des concepts météorologiques communs, leurs unités de sortie et les datasets compatibles. Consultez ce catalogue avant de comparer des modèles, puis résolvez le tuple exact de chaque dataset sans supposer que les noms des sélecteurs correspondent.

SELECT code, label, units, supported_datasets
FROM gribstream.shared_parameters
WHERE code = 'temperature_2m';
Exemple : calculer la vitesse du vent à 10 m

Après avoir trouvé les sélecteurs exacts des composantes du vent à 10 m pour ifsoper, combinez-les avec 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;
Syntaxe lisible par machine et commandes de découverte MySQL

Utilisez-les lorsque vous souhaitez que la connexion décrive elle-même sa syntaxe SQL et ses exemples :

SELECT topic, supported_syntax, example, notes
FROM gribstream.sql_dialect
ORDER BY topic;
SELECT name, description, `sql`
FROM gribstream.query_examples
ORDER BY name;

Les commandes MySQL courantes telles que SHOW TABLES, SHOW COLUMNS, DESCRIBE et SHOW CREATE TABLE sont également disponibles. SHOW FULL COLUMNS fournit de brèves descriptions météo et les correspondances exactes avec GS_VALUE :

SHOW FULL COLUMNS FROM gfs.timeseries;
Tables du catalogue
  • gribstream.datasets
  • gribstream.parameters
  • gribstream.parameter_variations
  • gribstream.selector_columns
  • gribstream.shared_parameters
  • gribstream.sql_dialect and gribstream.query_examples

Les requêtes de métadonnées acceptent les projections ou *, DISTINCT, ORDER BY, LIMIT avec un décalage positif ou nul, ainsi que des combinaisons bornées de =, !=, LIKE, IN et des tests NULL.

Valeurs, calculs et filtres

Les colonnes calculées utilisent des expressions SQL familières et peuvent référencer des alias définis plus tôt dans la liste de sélection. Donnez d’abord un alias à une colonne météo, puis réutilisez-le. Écrivez explicitement les conversions d’unités :

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);

Les conditions sur les valeurs météorologiques acceptent BETWEEN, IN numérique, les tests NULL, les parenthèses, NOT et les combinaisons booléennes. Reliez avec AND les conditions de temps, de lieu, de lead time, de membre et de run du modèle ; utilisez OR uniquement entre conditions portant sur des valeurs météorologiques.

Fonctions et calculs plus complexes

Les fonctions numériques courantes comprennent ABS, CEIL/CEILING, FLOOR, ROUND, SQRT, POW/POWER, MOD et TRUNCATE. Les libellés des points acceptent LOWER/LCASE, UPPER/UCASE, TRIM et CHAR_LENGTH, qui compte les caractères Unicode. La fonction MySQL LENGTH, qui compte les octets, n’est pas prise en charge ; utilisez CHAR_LENGTH pour les noms.

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;

Les autres fonctions d’expression GribStream utilisent l’espace de noms explicite func.. Les expressions acceptent les littéraux, les parenthèses, les opérateurs unaires, l’arithmétique, les comparaisons et les combinaisons booléennes. Consultez la référence des expressions pour connaître les appels func. disponibles et leurs arguments.

Unités, types de données et valeurs manquantes

Les colonnes de paramètres météorologiques et GS_VALUE renvoient les unités natives publiées dans le catalogue ; un alias ne convertit pas la valeur. Vérifiez has_code_table dans gribstream.parameters avant de traiter un champ codé comme une mesure continue.

Les valeurs météorologiques, expressions calculées, latitudes et longitudes sont renvoyées comme DOUBLE MySQL. Les colonnes temporelles sont des DATETIME(6) ; les identifiants du dataset, du point et du membre sont des chaînes de caractères. Les valeurs numériques ou temporelles manquantes deviennent NULL en SQL. Testez-les avec IS NULL ou IS NOT NULL ; = NULL n’est pas pris en charge.

Requêtes préparées

Les paramètres substituables MySQL habituels fonctionnent dans les sélecteurs, calculs, horodatages, coordonnées, membres et filtres météorologiques. Les fonctions de temps relatif sont évaluées à l’exécution de la requête préparée, pas lors de sa préparation.

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;
Résultats DISTINCT bornés

Les requêtes météorologiques peuvent utiliser SELECT DISTINCT ... LIMIT n. L’unicité porte sur la totalité de la ligne sélectionnée. Cette forme ne peut pas être combinée avec ORDER BY et la requête peut devoir lire toute la sélection bornée avant de savoir qu’il ne reste aucune nouvelle ligne. Utilisez-la pour dédupliquer un ensemble borné, pas pour remplacer des limites de temps et de lieu.

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;

Plages temporelles, temps relatif et fuseaux horaires

timeseries.forecasted_time est l’heure de validité. runs.forecasted_at est l’heure d’initialisation du modèle. Les plages exigent deux limites et incluent les deux extrémités lorsqu’elles utilisent BETWEEN.

Pour des fenêtres adjacentes, préférez une plage semi-ouverte telle que forecasted_time >= start AND forecasted_time < end. Elle évite de renvoyer deux fois l’instant situé à la frontière lorsque des requêtes consécutives sont réunies.

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;
Fonctions de temps relatif et formats d’horodatage pris en charge

NOW(), CURRENT_TIMESTAMP et UTC_TIMESTAMP() sont évalués une fois par requête en UTC ; une précision fractionnaire comme NOW(6) est acceptée. DATE_ADD, ADDDATE, DATE_SUB, SUBDATE et les formes + INTERVAL/- INTERVAL acceptent des unités entières fixes, des microsecondes aux semaines. Les mois et années sont exclus car leur durée varie.

Les littéraux temporels acceptent une date, un datetime MySQL, la forme ISO avec T ou RFC 3339 avec un décalage. Un littéral sans décalage est interprété en UTC, sauf s’il représente l’heure locale fournie à CONVERT_TZ.

Sélectionner des heures exactes et non contiguës

Utilisez = pour une heure exacte et IN pour plusieurs heures non contiguës. Utilisez forecasted_time sur timeseries et forecasted_at sur runs. Les exemples de requêtes contiennent un cas complet.

Interroger une journée locale et gérer le changement d’heure
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;

Les zones IANA nommées tiennent compte des changements d’heure. La plage de Paris ci-dessus couvre la journée de 25 heures du 25 octobre 2026 ; le même modèle semi-ouvert couvre correctement la journée de 23 heures du 29 mars. Les heures locales en entrée sont immédiatement converties en UTC ; les heures ambiguës ou inexistantes produisent une erreur claire. La conversion du résultat accepte aussi forecasted_at et index_updated_at. Conservez la colonne UTC originale lorsqu’une même heure locale peut apparaître deux fois. Les alias des colonnes temporelles converties servent uniquement à l’affichage et ne peuvent pas être utilisés dans WHERE.

Les connexions restent en UTC. SET time_zone accepte les valeurs équivalentes à UTC, SYSTEM ou DEFAULT ; utilisez CONVERT_TZ pour obtenir des horodatages locaux.

Appliquer une date limite historique aux runs du modèle

Sur timeseries, forecasted_at <= timestamp exclut les runs plus récents. C’est le seul opérateur pris en charge pour cette colonne sur timeseries ; utilisez index_updated_at lorsque la question concerne la mise à jour des données. Les exemples de requêtes contiennent un exemple complet de date limite historique.

Points, grilles, lead times et ensembles

Utilisez une paire de coordonnées pour un point, une liste de tuples pour plusieurs points nommés, ou des limites de latitude et longitude avec grid_step pour une grille régulière. Les exemples de requêtes illustrent chaque forme.

  • Un point : utilisez lat = value AND lon = value.
  • Plusieurs points : utilisez (lat, lon) ou (lat, lon, name) avec IN.
  • Une grille : bornez les deux coordonnées et définissez grid_step en degrés. Un pas plus petit sélectionne davantage de points et consomme plus de quota.
Filtres de lead time

Utilisez des durées entre guillemets, comme lead_time = '24h'. BETWEEN sélectionne une plage fermée ; les comparaisons appariées >=/< expriment une plage semi-ouverte ; une comparaison seule ne fournit qu’un minimum ou un maximum. Les durées acceptent des formes comme '90m', '24h' ou '168h'.

Filtres sur les membres d’ensemble

Vérifiez is_ensemble et le tableau JSON members dans gribstream.datasets avant de sélectionner des membres ; ne supposez pas que chaque dataset est un ensemble ni que les identifiants ont la même plage. Les exemples de requêtes contiennent un exemple de sélection de membres.

Conserver des requêtes efficaces

L’utilisation du quota dépend des données météorologiques lues pour évaluer une requête, et non du nombre de lignes renvoyées. Une condition sur une valeur météorologique ou un alias calculé — par exemple temp_c > 30 — ne peut retirer des lignes qu’après la lecture de ces valeurs. Une requête volumineuse peut donc consommer beaucoup de quota même si ses filtres renvoient très peu de lignes.

Les conditions sur l’heure de prévision, le lieu, le lead time et le membre d’ensemble réduisent les données sélectionnées. Les choix suivants ont le plus d’effet :

  • Utilisez timeseries, sauf si vous avez besoin de l’historique de plusieurs runs du modèle.
  • Gardez des plages temporelles courtes ou utilisez une liste d’heures exactes.
  • Sélectionnez uniquement les colonnes de paramètres météorologiques nécessaires.
  • Préférez des points exacts à une grande grille ; pour une grille, choisissez un grid_step adapté.
  • Bornez lead_time et sélectionnez seulement les membres d’ensemble nécessaires.

Utiliser le tri pour l’exploration

ORDER BY vise surtout les sessions interactives et l’exploration de données, lorsqu’un résultat immédiatement lisible justifie un travail supplémentaire. Pour une requête bornée, commencer le tri par la colonne temporelle principale permet généralement de recevoir les lignes progressivement. Utilisez forecasted_time pour timeseries ou forecasted_at pour runs, choisissez le sens voulu et ajoutez des colonnes ou alias sélectionnés comme clés secondaires si nécessaire.

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;

Pour runs, commencez par forecasted_at et bornez les deux côtés de lead_time. Si un résultat trié est trop volumineux pour être traité en toute sécurité, réduisez la sélection ou retirez ORDER BY et triez dans votre application.

Pour les chargements historiques et autres extractions volumineuses, omettez ORDER BY. Si l’ordre compte, triez après réception. Vous évitez ainsi que le tri limite le débit, notamment lorsqu’une sélection large est associée à des filtres de valeurs météorologiques.

Classements globaux

Un ordre commençant par une valeur météorologique doit examiner toute la sélection avant de renvoyer des lignes ; il exige donc LIMIT. Utilisez cette forme pour les classements plutôt que pour une lecture progressive. Les exemples de requêtes incluent une recherche complète des points les plus chauds.

Utiliser LIMIT pour la taille du résultat, pas pour le quota

LIMIT permet de réduire un résultat interactif, mais ne détermine pas la quantité de données météorologiques lues. Les filtres et le tri peuvent lire beaucoup plus de données que le résultat final n’en contient. Utilisez les contrôles de sélection ci-dessus pour réduire le quota consommé.

Avancé : valider une requête avec EXPLAIN

La plupart des requêtes n’ont pas besoin de EXPLAIN. Placez-le devant une requête météorologique pour valider l’instruction et obtenir des informations de diagnostic sans récupérer de lignes ni consommer de quota. Il sert principalement au dépannage et à l’assistance.

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;

Lecture progressive, annulation et erreurs

Les lignes deviennent disponibles progressivement. Leur affichage immédiat dépend du client ou de la bibliothèque MySQL ; pour les requêtes volumineuses, utilisez son interface non bufferisée, streaming, itérative ou par blocs. Le réglage exact dépend du client ; l’annexe des clients renvoie vers la documentation de chaque bibliothèque.

  • Déconnexion du client : fermer la connexion annule sa requête active.
  • Client MySQL : appuyez sur Ctrl+C pour arrêter la requête active.
Annulation dans une application et requêtes simultanées

Une connexion MySQL ne peut exécuter qu’une instruction active. Consommez ou fermez son résultat avant de la réutiliser ; employez un pool de connexions si l’application a réellement besoin de requêtes simultanées. Chaque connexion du pool s’authentifie indépendamment.

Utilisez l’API d’annulation ou le contexte de requête annulable de votre pilote ; son nom et son comportement dépendent du client. Pour annuler explicitement, exécutez KILL QUERY <connection_id> depuis une autre connexion utilisant le même token API. La connexion ciblée reste réutilisable.

Codes d’erreur MySQL

Les erreurs utilisent des réponses MySQL ordinaires afin que les clients existants les présentent naturellement :

SituationCode MySQLMessage
Syntaxe SQL1064Erreur d’analyse ou de validation près de l’entrée non prise en charge.
SQL non pris en charge1235Explication précise de la construction non prise en charge.
Token non valide1045Accès refusé pendant l’authentification de la connexion.
Requête annulée1317L’exécution de la requête a été interrompue.
Limite de débit1226Le message indique combien de temps attendre avant de réessayer, lorsque cette information est disponible.

Dépannage

Réduire la bande passante d’un résultat volumineux

Pour les extractions volumineuses, activez la compression du protocole MySQL si votre client ou pilote la prend en charge. Le réglage varie selon le client ; consultez la documentation officielle dans l’annexe.

Client MySQL : ajoutez --compression-algorithms=zstd lors de la connexion.

Depuis n’importe quel client, vérifiez la compression négociée avec :

SHOW SESSION STATUS LIKE 'Compression%';
La connexion TLS ne peut pas vérifier le certificat ou le nom d’hôte

Connectez-vous à mysql.gribstream.com, pas à son adresse IP, et utilisez un magasin de certificats de confiance à jour. Gardez la vérification d’identité active ; la désactiver peut masquer un mauvais nom d’hôte, une interception ou une chaîne de confiance incomplète. Les réglages dépendent du client ; consultez l’annexe des clients.

La connexion expire

Vérifiez que votre réseau autorise les connexions TCP sortantes vers mysql.gribstream.com sur le port 3307. Les pare-feu d’entreprise et certains notebooks restreints bloquent parfois les ports de base de données non standard.

Une colonne météo est inconnue ou un sélecteur exact est refusé

Exécutez SHOW FULL COLUMNS FROM <dataset>.timeseries et copiez la valeur Field au lieu de la deviner. Pour utiliser un sélecteur exact en SQL, copiez gs_value_sql depuis gribstream.selector_columns ; les sélecteurs sont sensibles à la casse et ne doivent être ni traduits ni normalisés.

Une valeur présente une échelle, une unité ou une signification inattendue

GribStream renvoie les valeurs natives publiées du sélecteur. Revérifiez units, description et has_code_table dans le catalogue, puis confirmez level et info. Les conversions d’unités sont des colonnes calculées explicites ; un alias AS ne modifie jamais les données à lui seul.

Une plage temporelle, un fuseau horaire ou une requête triée est refusé

Fournissez les deux limites temporelles. Convertissez en UTC les limites exprimées en heure locale avec CONVERT_TZ ; ne devinez pas une heure ambiguë ou inexistante lors d’un changement d’heure. Pour un tri non sûr, réduisez la sélection ou retirez ORDER BY et triez dans l’application.

Aucune ligne n’apparaît avant la fin de la requête

Votre client met le résultat en mémoire. Choisissez son mode non mis en mémoire, streaming, itératif ou par blocs. Client MySQL : reconnectez-vous avec --quick. pandas : fournissez chunksize. Pour les autres clients, suivez la documentation de lecture des résultats dans l’annexe.

La requête reçoit l’erreur MySQL 1226

Réduisez les requêtes simultanées ou attendez le délai indiqué dans le message avant de réessayer. Réessayer immédiatement ne fait que prolonger la limitation.

Utiliser la connexion comme outil autodescriptif pour les agents d’IA

Tout connecteur générique de base de données MySQL — y compris s’il est exposé comme outil MCP — peut se connecter à mysql.gribstream.com:3307. Fournissez le token API dans la configuration secrète du connecteur.

Donnez à l’agent le fichier d’instructions ci-dessous. Le schéma et les tables du catalogue lui permettent de découvrir les datasets, les colonnes météo, les unités, les correspondances exactes des sélecteurs, les règles du dialecte et des exemples prêts à l’emploi avant de construire une requête.

  1. Lire gribstream.sql_dialect et gribstream.query_examples.
  2. Rechercher dans gribstream.datasets, puis consulter SHOW FULL COLUMNS pour la table météo choisie.
  3. Utiliser gribstream.selector_columns lorsqu’une correspondance avec un sélecteur JSON exact ou GS_VALUE est nécessaire.
  4. Construire et exécuter la plus petite requête bornée qui répond à la question.
  5. Utiliser EXPLAIN uniquement pour valider ou dépanner une requête.

Télécharger les instructions GribStream MySQL pour agents, avec la procédure complète, les limites de syntaxe et les règles de récupération des données.

SQL pris en charge et limites délibérées

Requêtes météorologiques

  • SELECT depuis timeseries et runs
  • Colonnes météo découvertes et formes exactes avec GS_VALUE
  • Alias calculés, fonctions numériques et textuelles courantes, et appels func. documentés
  • Plages et listes temporelles, points, grilles, membres et lead times
  • Filtres booléens sur les valeurs météorologiques
  • Tri commençant par le temps ou top-N global borné
  • DISTINCT borné, requêtes préparées et diagnostic facultatif avec EXPLAIN

Délibérément non pris en charge

  • Écritures, DDL, transactions et verrous
  • Jointures, sous-requêtes, agrégation et regroupement
  • SELECT * pour les résultats météorologiques
  • Tri global non borné et expressions de tri
  • Décalages non nuls sur les résultats météorologiques
  • Fonctions MySQL non répertoriées et conversions SQL implicites

Ces limites rendent les requêtes prévisibles, permettent une lecture progressive des résultats et produisent des erreurs claires au lieu d’accepter un SQL au comportement surprenant.

Matrice de compatibilité complète
DomaineFormes prises en chargeLimite
SessionUSE, VERSION(), DATABASE(), fonctions temporelles UTC, variables de session courantes et contrôles d’étatComportement de compatibilité, pas l’ensemble complet des variables d’un serveur MySQL
DécouverteSHOW DATABASES, SHOW TABLES, SHOW FULL COLUMNS, DESCRIBE, SHOW CREATE TABLEUniquement les schémas et tables GribStream
SELECT de métadonnéesProjections ou *, DISTINCT, filtres booléens, ORDER BY, LIMIT et décalages positifs ou nulsUniquement les tables du catalogue et de information_schema
SELECT météorologiqueColonnes fixes et météo explicites, solution de repli GS_VALUE, calculs, conditions bornées, filtres et DISTINCT limitéPas de * météorologique, de jointures, de sous-requêtes, de regroupement ni d’agrégation
TriJusqu’à huit clés sélectionnées ; tri commençant par le temps ou top-N global limitéPas d’expressions, d’indices ordinaux, de clés en double ni de tri global non borné
Requêtes préparéesPlaceholders ? ordinaires dans les sélecteurs, expressions, heures, lieux, membres et filtresJusqu’à cinq requêtes préparées par connexion
Diagnostic avancéEXPLAIN SELECT ...Valide sans exécuter ; EXPLAIN ANALYZE n’est pas pris en charge
AnnulationKILL QUERY connection_id depuis une connexion utilisant le même tokenImpossible d’inspecter ou d’annuler le travail d’un autre token

Annexe : références de configuration des clients

TLS, la compression, la mise en mémoire des résultats, l’annulation, les délais d’attente et les pools de connexions se configurent dans le client ou le pilote, pas en SQL. Consultez la documentation de la bibliothèque que vous utilisez.

ClientDocumentation officielleUtile pour
MySQL CLIOptions du client et options de connexionTLS, compression, --quick, délais d’attente et autres options de la CLI
PythonArguments de connexion Connector/Python et read_sql de pandasTLS, compression, pool, options de connexion et DataFrames par blocs
JavaPropriétés de configuration Connector/JTLS, compression, délais d’attente et comportement JDBC
C# / .NETOptions de connexion MySqlConnectorTLS, compression, pool et délais d’attente
GoDocumentation de go-sql-driver/mysqlOptions DSN, TLS, compression, délais d’attente et pool
Node.jsDocumentation de mysql2Connexions, TLS, pools, requêtes préparées et lecture progressive des résultats
RustDocumentation du crate mysqlTLS, compression, pools et itération des lignes
CGuide de l’API C MySQLAPI de connexion et de résultats
DuckDBExtension MySQL de DuckDBIdentifiants dans les variables d’environnement, ATTACH en lecture seule, TLS, requêtes de tables distantes et mysql_query
DBeaverParamètres de connexion MySQL et configuration SSLConnexion MySQL 8, SSL, certificats de confiance et navigation dans la base