Ejecuta consultas con parámetros
BigQuery admite parámetros de consulta para ayudar a evitar la inyección de SQL cuando las consultas se construyen con entradas del usuario. Esta característica solo está disponible con la sintaxis de GoogleSQL. Los parámetros de consulta pueden usarse como sustitutos de expresiones arbitrarias. Los parámetros no se pueden usar como sustitutos de los identificadores, nombres de columnas, nombres de tablas ni otras partes de la consulta.
Para especificar un parámetro con nombre, usa el carácter @ seguido de un identificador, como @param_name. Como alternativa, usa el valor de marcador de posición ? para especificar un parámetro posicional. Ten en cuenta que una consulta puede usar parámetros posicionales o con nombre, pero no ambos.
Puedes ejecutar una consulta con parámetros en BigQuery de las siguientes maneras:
- El editor de consultas de BigQuery Studio en la Google Cloud consola
- El comando
bq queryde la herramienta de línea de comandos de bq - La API
- Las bibliotecas cliente
En el siguiente ejemplo, se muestra cómo pasar valores de parámetros a una consulta con parámetros:
Console
En el editor de consultas, ingresa tu consulta en SQL con parámetros con nombre. Para cada parámetro, usa el carácter @ seguido de un identificador.
Tipos de datos admitidos: La consola de Google Cloud solo admite consultas parametrizadas de tipos de datos primitivos, como BIGNUMERIC, BOOL, BYTES, DATE, DATETIME, FLOAT64, GEOGRAPHY, INT64, INTERVAL, NUMERIC, STRING, TIME o TIMESTAMP. Los tipos de datos complejos, como ARRAY y STRUCT, no se admiten en la consola de Google Cloud . Los Google Cloud pasos de la consola son compatibles con todos los tipos de datos primitivos.
Ejemplo:
SELECT
word,
word_count
FROM
`bigquery-public-data.samples.shakespeare`
WHERE
corpus = @corpus
AND
word_count >= @min_word_count
ORDER BY
word_count DESC;
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.
Usa
--parametera fin de proporcionar valores para los parámetros en la formaname:type:value. Un nombre vacío produce un parámetro posicional. Se puede omitir el tipo para que se supongaSTRING.La marca
--parameterdebe usarse junto con la marca--use_legacy_sql=falsepara especificar la sintaxis de GoogleSQL.Opcional: especifica tu ubicación a través de la marca
--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
Para usar parámetros con nombre, configura el parameterMode como NAMED en la configuración del trabajo query.
Propaga queryParameters con la lista de parámetros en la configuración del trabajo query. Establece el name de cada parámetro con el @param_name usado en la consulta.
Para habilitar la sintaxis de GoogleSQL, configura useLegacySql como 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"
}
Pruébalo en el Explorador de APIs de Google.
Para usar parámetros posicionales, configura parameterMode como POSITIONAL en la configuración del trabajo query.
C#
Antes de probar este ejemplo, sigue las instrucciones de configuración para C# incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para C#.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Para usar parámetros con nombre, haz lo siguiente:Antes de probar este ejemplo, sigue las instrucciones de configuración para C# incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para C#.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Para usar parámetros posicionales, haz lo siguiente:Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Para usar parámetros con nombre, haz lo siguiente:Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Para usar parámetros con nombre, haz lo siguiente:Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Para usar parámetros con nombre, haz lo siguiente:Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Para usar parámetros con nombre, haz lo siguiente:Usa arreglos en consultas con parámetros
Para usar un tipo de array en un parámetro de consulta, establece el tipo en ARRAY<T>, donde T es el tipo de los elementos del array. Construye el valor como una lista separada por comas de elementos encerrados entre corchetes, por ejemplo, [1, 2,
3].
Consulta la referencia de los tipos de datos para obtener más información sobre el tipo de arreglo.
Console
La consola deGoogle Cloud no admite arreglos en consultas con parámetros.
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.
En esta consulta, se seleccionan los nombres más populares para los bebés varones nacidos en los estados de EE.UU. que comienzan con la letra 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;'
Asegúrate de encerrar la declaración del tipo de arreglo entre comillas simples para que el resultado del comando no se redireccione por accidente a un archivo a través del carácter
>.
API
Para usar un parámetro con valor de arreglo, establece parameterType en ARRAY en la configuración del trabajo query.
Si los valores del arreglo son escalares, establece parameterType en el tipo de valores, como STRING. Si los valores del arreglo son estructuras, configura esto como STRUCT y agrega las definiciones de campo necesarias a structTypes.
Por ejemplo, en esta consulta se seleccionan los nombres más populares que comienzan con la letra W para los varones nacidos en los estados de EE.UU.
{
"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#
Antes de probar este ejemplo, sigue las instrucciones de configuración para C# incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para C#.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Usa marcas de tiempo en consultas con parámetros
Para usar una marca de tiempo en un parámetro de búsqueda, la API de REST subyacente toma un valor del tipo TIMESTAMP en el formato YYYY-MM-DD HH:MM:SS.DDDDDD time_zone. Si usas las bibliotecas cliente, crearás un objeto de fecha integrado con ese lenguaje, y la biblioteca lo convertirá al formato correcto. Para obtener más información, consulta los siguientes ejemplos con lenguajes específicos.
Para obtener más información sobre el tipo TIMESTAMP, consulta la referencia de tipos de datos.
Console
Define tus parámetros con los siguientes pasos, que demuestran este proceso con el tipo de datos TIMESTAMP. Estos pasos basados en la consola se aplican a cualquier tipo primitivo, como BOOL y STRING. No se admiten tipos de datos complejos, como ARRAY y STRUCT, en la consola deGoogle Cloud .
Ve a la página de BigQuery.
En la barra de herramientas del editor de consultas, haz clic en Más y selecciona Configuración de consulta.
En el panel Configuración de la consulta, ubica la sección Parámetros de consulta y haz clic en Agregar parámetro.
Para cada parámetro de tu búsqueda, proporciona la siguiente información:
- Nombre: Ingresa el nombre del parámetro (no incluyas el símbolo @).
- Tipo: Selecciona el tipo de datos
TIMESTAMPpara el parámetro. Se admiten otros tipos de datos primitivos. - Valor: Ingresa el valor que deseas usar para esta ejecución.
Haz clic en Guardar.
Para ejecutar la consulta con parámetros en el editor de consultas, haz clic en Ejecutar.
Si la búsqueda contiene un parámetro faltante o no válido, se mostrará un mensaje de error. Haz clic en Establecer parámetro en el mensaje de error para ajustar la configuración del parámetro.
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.
Esta consulta agrega una hora al valor del parámetro de marca de tiempo:
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
Para usar un parámetro de marca de tiempo, establece parameterType en TIMESTAMP en la configuración del trabajo de consulta.
Esta consulta agrega una hora al valor del parámetro de marca de tiempo.
{
"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#
Antes de probar este ejemplo, sigue las instrucciones de configuración para C# incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para C#.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Usa structs en consultas con parámetros
Para usar un struct en un parámetro de consulta, establece el tipo en STRUCT<T>, donde T define los campos y tipos dentro del struct. Las definiciones de campos se separan por comas y tienen la forma field_name TF, en la que TF es el tipo de campo. Por ejemplo, STRUCT<x INT64, y STRING> define un struct con un campo llamado x del tipo INT64 y un segundo campo llamado y del tipo STRING.
Para obtener más información sobre el tipo STRUCT, consulta la referencia de tipos de datos.
Console
La consola deGoogle Cloud no admite structs en consultas con parámetros.
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.
En esta consulta trivial, se muestra el valor del parámetro para demostrar el uso de tipos estructurados:
bq query \ --use_legacy_sql=false \ --parameter='struct_value:STRUCT<x INT64, y STRING>:{"x": 1, "y": "foo"}' \ 'SELECT @struct_value AS s;'
API
Para usar un parámetro de struct, establece parameterType en STRUCT en la configuración del trabajo de consulta.
Agrega un objeto para cada campo del struct a structTypes en el queryParameters del trabajo.
Si los valores del struct son escalares, establece type en el tipo de valores, como STRING. Si los valores del struct son arreglos, configura esto como ARRAY y el campo arrayType anidado como el tipo adecuado. Si los valores de struct son estructuras, establece type como STRUCT y agrega los structTypes necesarios.
En esta consulta trivial, se muestra el valor del parámetro para demostrar el uso de tipos estructurados.
{
"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 biblioteca cliente de BigQuery para .NET no admite parámetros de estructura.
Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.
Usa rangos en consultas con parámetros
Para usar un rango en un parámetro de consulta, establece el campo type en RANGE.
Para obtener más información sobre el tipo RANGE, consulta la referencia de tipos de datos.
Console
La consola deGoogle Cloud no admite rangos en las consultas con parámetros.
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.
En esta consulta, se muestra el uso de tipos de rango devolviendo el valor del parámetro:
bq query \ --use_legacy_sql=false \ --parameter='my_param:RANGE<DATE>:[2020-01-01, 2020-12-31)' \ 'SELECT @my_param AS foo;'
API
Para usar un parámetro de rango, en parameterType, establece el campo type en RANGE y el campo rangeElementType en el tipo de rango que deseas usar.
En esta consulta, se muestra cómo usar el tipo de parámetro RANGE devolviendo el valor del parámetro.
{
"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"
}