Exécuter des requêtes paramétrées
BigQuery accepte les paramètres de requête pour parer au risque d'injection SQL dans les requêtes conçues pour faire intervenir des entrées utilisateur. Cette fonctionnalité n'est disponible qu'avec la syntaxe GoogleSQL. Les paramètres de requête peuvent être utilisés pour remplacer des expressions arbitraires. 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.
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. Notez qu'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 la requête, puis référencez-les dans votre requête SQL en faisant précéder chaque nom de paramètre par le caractère @.
Types de données acceptés : la console Google Cloud n'accepte que 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 acceptés dans 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 Plus, puis sélectionnez Paramètres de requête.
Dans le volet Paramètres de la requête, recherchez la section Paramètres de la requête, puis cliquez sur Ajouter un paramètre.
Pour chaque paramètre de votre requête, fournissez les informations suivantes :
- 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. Pour les référencer, faites précéder leur nom du caractère
@, comme indiqué 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 du paramètre.
Pour exécuter la requête paramétrée dans l'éditeur de requête, cliquez sur Exécuter.
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
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 l'explorateur d'API Google.
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 à l'aide de 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 ARRAY dans un paramètre de requête, définissez le type sur ARRAY<T>, où T correspond au 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 acceptés par la consoleGoogle Cloud .
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
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 type ARRAY, définissez parameterType sur ARRAY dans la configuration de la tâche 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 valeurs d'horodatage 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 pour ajouter des paramètres dans la console Google Cloud décrite précédemment dans ce document. Sélectionnez TIMESTAMP pour le type de paramètre et saisissez la valeur de l'horodatage au format YYYY-MM-DD HH:MM:SS.DDDDDD time_zone.
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Cette requête ajoute une heure à la valeur du paramètre d'horodatage :
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 d'horodatage, définissez parameterType sur TIMESTAMP dans la configuration de la tâche 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 structs dans des requêtes paramétrées
Pour utiliser une structure dans un paramètre de requête, définissez le type sur STRUCT<T>, où T définit les champs et les types utilisés dans la structure. 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
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
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 de la tâche 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 dans les requêtes paramétrées ne sont pas compatibles avec la consoleGoogle Cloud .
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Cette requête illustre l'utilisation de types de plage 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"
}