Exécuter des requêtes paramétrées
Les requêtes paramétrées dans BigQuery vous permettent de remplacer des expressions arbitraires directement dans vos instructions GoogleSQL. La transmission de paramètres pour des types de données tels que les tableaux, les codes temporels, les structures et les plages vous permet d'exécuter de manière sécurisée des requêtes effectuées à partir d'entrées utilisateur, tout en protégeant vos données contre les attaques par injection SQL.
Limites
- Les paramètres de requête ne sont compatibles qu'avec la syntaxe GoogleSQL.
- Vous ne pouvez pas substituer un paramètre à un identifiant, à un nom de colonne, à un nom de table ni aucune autre partie de la requête.
- La valeur d'un paramètre de requête ne peut pas être
NULL.
Transmettre un paramètre dans une requête
Pour spécifier un paramètre nommé, utilisez le caractère @ suivi d'un identifiant, tel que @param_name. Vous pouvez également utiliser la valeur d'espace réservé ? pour spécifier un paramètre positionnel. Une requête peut utiliser des paramètres positionnels ou des paramètres nommés, mais pas les deux à la fois.
Vous pouvez exécuter une requête paramétrée dans BigQuery de plusieurs manières :
- L'éditeur de requête BigQuery Studio dans la console Google Cloud
- Commande
bq queryde l'outil de ligne de commande bq - L'API
- Bibliothèques clientes
Les exemples suivants montrent comment transmettre des valeurs de paramètres à une requête paramétrée :
Console
Pour exécuter une requête paramétrée dans la console Google Cloud , configurez les paramètres dans Paramètres de requête, puis référencez-les dans votre requête SQL en faisant précéder chaque nom de paramètre du caractère @.
Types de données compatibles : la console Google Cloud n'est compatible qu'avec les requêtes paramétrées de types de données primitifs, tels que BIGNUMERIC, BOOL, BYTES, DATE, DATETIME, FLOAT64, GEOGRAPHY, INT64, INTERVAL, NUMERIC, STRING, TIME ou TIMESTAMP. Les types de données complexes, tels que ARRAY et STRUCT, ne sont pas compatibles avec la console Google Cloud .
Ajouter les paramètres dans la console Google Cloud
Accédez à la page BigQuery.
Dans la barre d'outils de l'éditeur de requête, cliquez sur Modifier > Paramètres de requête.
Dans le volet Paramètres de requête, recherchez la section Paramètres de requête, puis cliquez sur Ajouter un paramètre.
Pour chaque paramètre de votre requête, indiquez les éléments suivants :
- Nom : saisissez le nom du paramètre (n'incluez pas le caractère
@). - Type : sélectionnez le type de données du paramètre.
- Valeur : saisissez la valeur que vous souhaitez utiliser pour cette exécution.
- Nom : saisissez le nom du paramètre (n'incluez pas le caractère
Cliquez sur Enregistrer.
Transmettre des valeurs de paramètre à une requête dans la console Google Cloud
Dans l'éditeur de requête, saisissez une requête SQL à l'aide des paramètres que vous avez configurés à l'étape précédente. Référencez-les en ajoutant le caractère
@en préfixe de leur nom, comme illustré dans l'exemple.Exemple :
SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;Pour cet exemple, vous devez ajouter le paramètre
corpusen tant queSTRINGavec la valeurromeoandjuliet, et le paramètremin_word_counten tant queINT64avec la valeur250.Si la requête contient un paramètre manquant ou non valide, un message d'erreur s'affiche. Cliquez sur Définir le paramètre dans le message d'erreur pour ajuster les paramètres.
Pour exécuter la requête paramétrée dans l'éditeur de requête, cliquez sur Exécuter.
bq
-
Dans la console Google Cloud , activez Cloud Shell.
En bas de la fenêtre de la console Google Cloud , une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement de shell dans lequel la Google Cloud CLI est déjà installée, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.
L'indicateur
--parameterpermet de fournir des valeurs pour les paramètres selon le formatname:type:value. Un nom vide engendre un paramètre positionnel. Le type peut être omis s'il s'agit deSTRING.L'option
--parameterdoit être utilisé conjointement avec l'option--use_legacy_sql=falsepour spécifier la syntaxe GoogleSQL.(Facultatif) Spécifiez votre emplacement à l'aide de l'option
--location.bq query \ --use_legacy_sql=false \ --parameter=corpus::romeoandjuliet \ --parameter=min_word_count:INT64:250 \ 'SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;'
API
Pour utiliser des paramètres nommés, définissez parameterMode sur NAMED dans la configuration de la tâche query.
Dans la configuration de la tâche query, insérez la liste des paramètres dans queryParameters. Définissez l'élément name de chaque paramètre sur le paramètre @param_name utilisé dans la requête.
Activez la syntaxe GoogleSQL en définissant useLegacySql sur false.
{
"query": "SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;",
"queryParameters": [
{
"parameterType": {
"type": "STRING"
},
"parameterValue": {
"value": "romeoandjuliet"
},
"name": "corpus"
},
{
"parameterType": {
"type": "INT64"
},
"parameterValue": {
"value": "250"
},
"name": "min_word_count"
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
Testez cette requête dans Google APIs Explorer.
Pour utiliser des paramètres positionnels, définissez parameterMode sur POSITIONAL dans la configuration de la tâche query.
C#
Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour C#.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour utiliser des paramètres nommés :Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour C#.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour utiliser des paramètres positionnels :Go
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour utiliser des paramètres nommés :Java
Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour utiliser des paramètres nommés :Node.js
Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour utiliser des paramètres nommés :Python
Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour utiliser des paramètres nommés :Utiliser des tableaux dans des requêtes paramétrées
Pour utiliser un type de tableau dans un paramètre de requête, définissez le type sur ARRAY<T>, où T est le type des éléments du tableau. Construisez la valeur sous la forme d'une liste entre crochets d'éléments séparés par des virgules, comme [1, 2,
3].
Console
Les tableaux dans les requêtes paramétrées ne sont pas compatibles avec la consoleGoogle Cloud .
bq
-
Dans la console Google Cloud , activez Cloud Shell.
En bas de la fenêtre de la console Google Cloud , une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement de shell dans lequel la Google Cloud CLI est déjà installée, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.
Par exemple, cette requête sélectionne les noms masculins les plus populaires pour les bébés nés dans les États américains dont le nom commence par la lettre W :
bq query \ --use_legacy_sql=false \ --parameter='gender::M' \ --parameter='states:ARRAY<STRING>:["WA", "WI", "WV", "WY"]' \ 'SELECT name, SUM(number) AS count FROM `bigquery-public-data.usa_names.usa_1910_2013` WHERE gender = @gender AND state IN UNNEST(@states) GROUP BY name ORDER BY count DESC LIMIT 10;'
Veillez à délimiter la déclaration du type ARRAY par des guillemets simples, afin que le résultat de la commande ne puisse pas être redirigé accidentellement vers un fichier par le caractère
>.
API
Pour utiliser un paramètre de valeur de tableau, définissez parameterType sur ARRAY dans la configuration de job query.
Si les valeurs du tableau sont scalaires, définissez l'élément parameterType sur le type de ces valeurs, par exemple STRING. Si les valeurs du tableau sont des structures, définissez l'élément sur STRUCT et ajoutez les définitions de champs requises à structTypes.
Par exemple, cette requête sélectionne les noms masculins les plus populaires pour les bébés nés dans les États américains dont le nom commence par la lettre W.
{
"query": "SELECT name, sum(number) as count\nFROM `bigquery-public-data.usa_names.usa_1910_2013`\nWHERE gender = @gender\nAND state IN UNNEST(@states)\nGROUP BY name\nORDER BY count DESC\nLIMIT 10;",
"queryParameters": [
{
"parameterType": {
"type": "STRING"
},
"parameterValue": {
"value": "M"
},
"name": "gender"
},
{
"parameterType": {
"type": "ARRAY",
"arrayType": {
"type": "STRING"
}
},
"parameterValue": {
"arrayValues": [
{
"value": "WA"
},
{
"value": "WI"
},
{
"value": "WV"
},
{
"value": "WY"
}
]
},
"name": "states"
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
C#
Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour C#.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Go
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Java
Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Node.js
Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Python
Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Utiliser des codes temporels dans des requêtes paramétrées
Pour utiliser un horodatage dans un paramètre de requête, l'API REST sous-jacente prend une valeur de type TIMESTAMP au format YYYY-MM-DD HH:MM:SS.DDDDDD time_zone. Si vous utilisez les bibliothèques clientes, vous créez un objet de date intégré dans cette langue que la bibliothèque convertit au format approprié. Pour en savoir plus, consultez les exemples spécifiques aux langages suivants.
Pour plus d'informations sur le type TIMESTAMP, consultez la documentation sur les types de données.
Console
Suivez la procédure d'ajout de paramètres dans la console Google Cloud décrite précédemment dans ce document. Sélectionnez TIMESTAMP pour le type de paramètre, puis saisissez la valeur du code temporel au format YYYY-MM-DD HH:MM:SS.DDDDDD time_zone.
bq
-
Dans la console Google Cloud , activez Cloud Shell.
En bas de la fenêtre de la console Google Cloud , une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement de shell dans lequel la Google Cloud CLI est déjà installée, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.
Cette requête ajoute une heure à la valeur du paramètre de code temporel :
bq query \ --use_legacy_sql=false \ --parameter='ts_value:TIMESTAMP:2016-12-07 08:00:00' \ 'SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);'
API
Pour utiliser un paramètre de code temporel, définissez parameterType sur TIMESTAMP dans la configuration du job de requête.
Cette requête ajoute une heure à la valeur du paramètre d'horodatage.
{
"query": "SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);",
"queryParameters": [
{
"name": "ts_value",
"parameterType": {
"type": "TIMESTAMP"
},
"parameterValue": {
"value": "2016-12-07 08:00:00"
}
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
C#
Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour C#.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Go
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Java
Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Node.js
Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Python
Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Utiliser des structures dans des requêtes paramétrées
Pour utiliser un struct dans un paramètre de requête, définissez le type sur STRUCT<T>, où T définit les champs et les types dans le struct. Les définitions de champ sont séparées par des virgules et prennent la forme field_name TF, où TF est le type du champ. Par exemple, STRUCT<x INT64, y STRING> définit une structure contenant un champ nommé x du type INT64 et un second champ nommé y du type STRING.
Pour plus d'informations sur le type STRUCT, consultez la documentation sur les types de données.
Console
Les structures dans les requêtes paramétrées ne sont pas compatibles avec la consoleGoogle Cloud .
bq
-
Dans la console Google Cloud , activez Cloud Shell.
En bas de la fenêtre de la console Google Cloud , une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement de shell dans lequel la Google Cloud CLI est déjà installée, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.
Cette requête élémentaire illustre l'utilisation de types structurés en renvoyant la valeur du paramètre :
bq query \ --use_legacy_sql=false \ --parameter='struct_value:STRUCT<x INT64, y STRING>:{"x": 1, "y": "foo"}' \ 'SELECT @struct_value AS s;'
API
Pour utiliser un paramètre de structure, définissez parameterType sur STRUCT dans la configuration du job de requête.
Ajoutez un objet à structTypes pour chaque champ de la structure dans le paramètre queryParameters de la tâche.
Si les valeurs de la structure sont des scalaires, définissez type sur le type des valeurs, par exemple STRING. Si les valeurs de structure sont des tableaux, définissez cette valeur sur ARRAY, puis spécifiez le champ imbriqué arrayType sur le type approprié. Si les valeurs de structure sont elles-mêmes des structures, définissez type sur STRUCT, puis ajoutez les valeurs structTypes requises.
Cette requête élémentaire illustre l'utilisation de types structurés en renvoyant la valeur du paramètre.
{
"query": "SELECT @struct_value AS s;",
"queryParameters": [
{
"name": "struct_value",
"parameterType": {
"type": "STRUCT",
"structTypes": [
{
"name": "x",
"type": {
"type": "INT64"
}
},
{
"name": "y",
"type": {
"type": "STRING"
}
}
]
},
"parameterValue": {
"structValues": {
"x": {
"value": "1"
},
"y": {
"value": "foo"
}
}
}
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
C#
La bibliothèque cliente BigQuery pour .NET n'est pas compatible avec les paramètres STRUCT.
Go
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Java
Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Node.js
Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Python
Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Utiliser des plages dans des requêtes paramétrées
Pour utiliser une plage dans un paramètre de requête, définissez le champ type sur RANGE.
Pour plus d'informations sur le type RANGE, consultez la documentation sur les types de données.
Console
Les plages des requêtes paramétrées ne sont pas compatibles avec la consoleGoogle Cloud .
bq
-
Dans la console Google Cloud , activez Cloud Shell.
En bas de la fenêtre de la console Google Cloud , une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement de shell dans lequel la Google Cloud CLI est déjà installée, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.
Cette requête illustre l'utilisation de types de plages en renvoyant la valeur du paramètre :
bq query \ --use_legacy_sql=false \ --parameter='my_param:RANGE<DATE>:[2020-01-01, 2020-12-31)' \ 'SELECT @my_param AS foo;'
API
Pour utiliser un paramètre de plage, dans parameterType, définissez le champ type sur RANGE et le champ rangeElementType sur le type de plage que vous souhaitez utiliser.
Cette requête montre comment utiliser le type de paramètre RANGE en renvoyant la valeur du paramètre.
{
"query": "SELECT @my_param AS value_of_range_parameter;",
"queryParameters": [
{
"name": "range_param",
"parameterType": {
"type": "RANGE",
"rangeElementTYpe": {
"type": "DATE"
}
},
"parameterValue": {
"rangeValue": {
"start": {
"value": "2020-01-01"
},
"end": {
"value": "2020-12-31"
}
}
}
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
Étapes suivantes
- Découvrez les requêtes paramétrées validées dans l'analyse conversationnelle BigQuery.