הרצת שאילתות שמכילות פרמטרים
כשמריצים שאילתות על נתונים ב-BigQuery באמצעות תחביר GoogleSQL, אפשר להשתמש בפרמטרים כדי להגן על שאילתות שנוצרות מקלט של משתמשים מפני הזרקת SQL. הפרמטרים מחליפים ביטויים שרירותיים בשאילתות GoogleSQL.
מעבירים פרמטרים של שאילתות לסוגים שונים של נתונים, כולל:
- מערכים
- חותמות זמן
- Structs
- טווחים
העברת פרמטר בשאילתה
פרמטרים של שאילתה נתמכים רק בתחביר GoogleSQL. אי אפשר להשתמש בפרמטרים במקום מזהים, שמות עמודות, שמות טבלאות או חלקים אחרים של השאילתה.
כדי לציין פרמטר עם שם, משתמשים בתו @ ואחריו במזהה, כמו @param_name. לחלופין, אפשר להשתמש בערך הפלייסהולדר ? כדי לציין פרמטר מיקום. שאילתה יכולה להשתמש בפרמטרים מיקומיים או בפרמטרים עם שם, אבל לא בשניהם.
אפשר להריץ שאילתה שמכילה פרמטרים ב-BigQuery באופנים הבאים:
- עורך השאילתות של BigQuery Studio במסוף Google Cloud
- הפקודה
bq queryבכלי שורת הפקודה bq - API
- ספריות הלקוח
בדוגמאות הבאות מוצג איך להעביר ערכי פרמטרים לשאילתה עם פרמטרים:
המסוף
כדי להריץ שאילתה עם פרמטרים במסוף Google Cloud , מגדירים פרמטרים בהגדרות השאילתה, ואז מפנים אליהם בשאילתת ה-SQL על ידי הוספת התו @ לפני כל שם פרמטר.
סוגי נתונים נתמכים: מסוף Google Cloud תומך רק בשאילתות עם פרמטרים של סוגי נתונים פרימיטיביים, כמו BIGNUMERIC, BOOL, BYTES, DATE, DATETIME, FLOAT64, GEOGRAPHY, INT64, INTERVAL, NUMERIC, STRING, TIME או TIMESTAMP. סוגי נתונים מורכבים, כמו ARRAY ו-STRUCT, לא נתמכים במסוף Google Cloud .
הוספת הפרמטרים במסוף Google Cloud
עוברים לדף BigQuery.
בסרגל הכלים של עורך השאילתות, לוחצים על עוד ובוחרים באפשרות הגדרות השאילתה.
בחלונית הגדרות שאילתה, מאתרים את הקטע פרמטרים של שאילתה ולוחצים על הוספת פרמטר.
לכל פרמטר בשאילתה, צריך לציין את הפרטים הבאים:
- שם: מזינים את שם הפרמטר (לא כוללים את התו
@). - סוג: בוחרים את סוג הנתונים של הפרמטר.
- ערך: מזינים את הערך שרוצים להשתמש בו בהפעלה הזו.
- שם: מזינים את שם הפרמטר (לא כוללים את התו
לוחצים על Save.
העברת ערכי פרמטרים לשאילתה במסוף Google Cloud
בעורך השאילתות, מזינים שאילתת SQL באמצעות הפרמטרים שהגדרתם בשלב הקודם. כדי להפנות אליהם, מוסיפים את התו
@לפני השמות שלהם, כמו בדוגמה.לדוגמה:
SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;בדוגמה הזו, מוסיפים את הפרמטר
corpusכ-STRINGעם הערךromeoandjuliet, ואת הפרמטרmin_word_countכ-INT64עם הערך250.אם השאילתה מכילה פרמטר חסר או לא תקין, תוצג הודעת שגיאה. לוחצים על הגדרת פרמטר בהודעת השגיאה כדי לשנות את הגדרות הפרמטר.
כדי להריץ את השאילתה עם הפרמטרים בעורך השאילתות, לוחצים על הפעלה.
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.
משתמשים ב-
--parameterכדי לספק ערכים לפרמטרים בפורמטname:type:value. שם ריק יוצר פרמטר מיקום. אפשר להשמיט את הסוג כדי להניחSTRING.צריך להשתמש בדגל
--parameterבשילוב עם הדגל--use_legacy_sql=falseכדי לציין את התחביר של GoogleSQL.(אופציונלי) מציינים את המיקום באמצעות הדגל
--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
כדי להשתמש בפרמטרים עם שמות, צריך להגדיר את parameterMode ל-NAMED בהגדרות של משימת query.
מאכלסים את queryParameters ברשימת הפרמטרים בהגדרת המשימה query. מגדירים את name של כל פרמטר באמצעות @param_name שמשמש בשאילתה.
מפעילים את תחביר GoogleSQL
על ידי הגדרת useLegacySql לערך 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"
}
לניסיון ב-Google APIs Explorer
כדי להשתמש בפרמטרים מיקומיים, צריך להגדיר את parameterMode ל-POSITIONAL בהגדרת המשימה query.
C#
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להשתמש בפרמטרים עם שמות:לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להשתמש בפרמטרים מיקומיים:Go
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להשתמש בפרמטרים עם שמות:Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להשתמש בפרמטרים עם שמות:Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להשתמש בפרמטרים עם שמות:Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
כדי להשתמש בפרמטרים עם שמות:שימוש במערכים בשאילתות עם פרמטרים
כדי להשתמש בסוג מערך בפרמטר של שאילתה, מגדירים את הסוג ל-ARRAY<T>, כאשר T הוא סוג הרכיבים במערך. יוצרים את הערך כרשימה של רכיבים שמופרדים בפסיקים ומוקפים בסוגריים מרובעים, כמו [1, 2,
3].
מידע נוסף על סוג המערך מופיע במאמר הפניה לסוגי נתונים.
המסוף
מערכים בשאילתות עם פרמטרים לא נתמכים במסוףGoogle 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.
השאילתה הזו בוחרת את השמות הפופולריים ביותר לתינוקות בנים שנולדו במדינות בארה"ב שמתחילות באות 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;'
חשוב להקפיד להוסיף גרשיים בודדים להצהרה על סוג המערך, כדי שפלט הפקודה לא יופנה בטעות לקובץ על ידי התו
>.
API
כדי להשתמש בפרמטר עם ערך מסוג מערך, צריך להגדיר את parameterType ל-ARRAY בהגדרת המשימה query.
אם הערכים במערך הם סקלרים, צריך להגדיר את parameterType
לסוג הערכים, למשל STRING. אם ערכי המערך הם מבנים, צריך להגדיר את הערך STRUCT ולהוסיף את הגדרות השדות הנדרשות ל-structTypes.
לדוגמה, השאילתה הזו בוחרת את השמות הפופולריים ביותר לתינוקות בנים שנולדו במדינות בארה"ב שמתחילות באות 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#
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Go
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
שימוש בחותמות זמן בשאילתות שמכילות פרמטרים
כדי להשתמש בחותמת זמן בפרמטר של שאילתה, ה-API הבסיסי בארכיטקטורת REST מקבל ערך מסוג TIMESTAMP בפורמט YYYY-MM-DD HH:MM:SS.DDDDDD time_zone. אם אתם משתמשים בספריות הלקוח, אתם יוצרים אובייקט תאריך מובנה בשפה הזו, והספרייה ממירה אותו לפורמט הנכון. מידע נוסף זמין בדוגמאות הבאות לפי שפה.
מידע נוסף על הסוג TIMESTAMP זמין במאמר בנושא סוגי נתונים.
המסוף
פועלים לפי השלבים להוספת פרמטרים במסוף Google Cloud שמתוארים בהמשך המאמר הזה. בוחרים באפשרות TIMESTAMP בשביל סוג הפרמטר ומזינים את ערך חותמת הזמן בפורמט 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.
השאילתה הזו מוסיפה שעה לערך פרמטר חותמת הזמן:
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
כדי להשתמש בפרמטר של חותמת זמן, צריך להגדיר את הערך של parameterType ל-TIMESTAMP בהגדרות של עבודת השאילתה.
השאילתה הזו מוסיפה שעה לערך הפרמטר של חותמת הזמן.
{
"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#
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Go
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
שימוש במבנים בשאילתות שמכילות פרמטרים
כדי להשתמש במבנה נתונים בפרמטר של שאילתה, מגדירים את הסוג ל-STRUCT<T>, כאשר T מגדיר את השדות והסוגים בתוך המבנה. הגדרות השדות מופרדות באמצעות פסיקים, והן מהצורה field_name TF, כאשר TF הוא סוג השדה. לדוגמה, STRUCT<x INT64, y STRING> מגדיר מבנה עם שדה בשם x מסוג INT64 ושדה שני בשם y מסוג STRING.
מידע נוסף על הסוג STRUCT זמין במאמר בנושא סוגי נתונים .
המסוף
המסוףGoogle 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.
השאילתה הפשוטה הזו מדגימה את השימוש בסוגים מובנים על ידי החזרת ערך הפרמטר:
bq query \ --use_legacy_sql=false \ --parameter='struct_value:STRUCT<x INT64, y STRING>:{"x": 1, "y": "foo"}' \ 'SELECT @struct_value AS s;'
API
כדי להשתמש בפרמטר מסוג struct, צריך להגדיר את parameterType לערך STRUCT בהגדרות של עבודת השאילתה.
מוסיפים אובייקט לכל שדה במבנה אל structTypes ב-queryParameters של המשרה.
אם הערכים של המבנה הם סקלרים, צריך להגדיר את type לסוג הערכים, כמו STRING. אם ערכי המבנה הם מערכים, צריך להגדיר את הערך הזה כ-ARRAY ולהגדיר את השדה המקונן arrayType לסוג המתאים. אם ערכי ה-struct הם מבנים, מגדירים את type ל-STRUCT ומוסיפים את structTypes הנדרש.
השאילתה הפשוטה הזו מדגימה את השימוש בסוגים מובנים על ידי החזרת ערך הפרמטר.
{
"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#
ספריית הלקוח BigQuery ל- .NET לא תומכת בפרמטרים של struct.
Go
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
שימוש בטווחים בשאילתות שמכילות פרמטרים
כדי להשתמש בטווח בפרמטר של שאילתה, מגדירים את השדה type לערך RANGE.
מידע נוסף על הסוג RANGE זמין במאמר בנושא סוגי נתונים .
המסוף
המסוףGoogle 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.
בדוגמה הזו לשאילתה מוצג שימוש בסוגי טווחים. השאילתה מחזירה את ערך הפרמטר:
bq query \ --use_legacy_sql=false \ --parameter='my_param:RANGE<DATE>:[2020-01-01, 2020-12-31)' \ 'SELECT @my_param AS foo;'
API
כדי להשתמש בפרמטר של טווח, בשדה parameterType מגדירים את השדה type לערך RANGE ואת השדה rangeElementType לסוג הטווח שרוצים להשתמש בו.
השאילתה הזו מראה איך להשתמש בפרמטר RANGE כדי להחזיר את ערך הפרמטר.
{
"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"
}