מטרות
במדריך הזה נסביר איך לבצע את הפעולות הבאות באמצעות מנהל ההתקן database/sql של Spanner:
- יוצרים מכונה ומסד נתונים ב-Spanner.
- לכתוב, לקרוא ולהריץ שאילתות SQL על נתונים במסד הנתונים.
- מעדכנים את הסכימה של מסד הנתונים.
- עדכון נתונים באמצעות טרנזקציית קריאה-כתיבה.
- מוסיפים אינדקס משני למסד הנתונים.
- משתמשים באינדקס כדי לקרוא ולהריץ שאילתות SQL על נתונים.
- אחזור נתונים באמצעות טרנזקציה לקריאה בלבד.
עלויות
במדריך הזה משתמשים ב-Spanner, רכיב שלGoogle Cloudשהשימוש בו כרוך בתשלום. למידע על עלות השימוש ב-Spanner, ראו תמחור.
לפני שמתחילים
מבצעים את השלבים שמפורטים בקטע הגדרה, שכוללים יצירה והגדרה של פרויקט Google Cloud כברירת מחדל, הפעלת החיוב, הפעלת Cloud Spanner API והגדרת OAuth 2.0 כדי לקבל פרטי כניסה לאימות לשימוש ב-Cloud Spanner API.
חשוב במיוחד להריץ את הפקודה gcloud auth
application-default login כדי להגדיר את סביבת הפיתוח המקומית עם פרטי כניסה לאימות.
הכנת סביבת מסד הנתונים/SQL המקומית
אם Go לא מותקנת במחשב הפיתוח, מורידים ומתקינים אותה.
משכפלים את המאגר לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/googleapis/go-sql-spanner.gitעוברים לספרייה שמכילה את הקוד לדוגמה של Spanner:
cd go-sql-spanner/snippets
יצירת מכונה
בפעם הראשונה שמשתמשים ב-Spanner, צריך ליצור מכונה – הקצאה של משאבים שמשמשים את מסדי הנתונים של Spanner. כשיוצרים מכונה, בוחרים הגדרת מכונה שקובעת איפה הנתונים יאוחסנו, וגם את מספר הצמתים שבהם משתמשים, שקובע את כמות משאבי האחסון וההצגה במכונה.
במאמר יצירת מכונה מוסבר איך ליצור מכונה של Spanner באמצעות אחת מהשיטות הבאות. אפשר לתת למכונה את השם test-instance כדי להשתמש בה עם נושאים אחרים במסמך הזה, שמתייחסים למכונה בשם test-instance.
- Google Cloud CLI
- מסוף Google Cloud
- ספריית לקוח (C++, C#, Go, Java, Node.js, PHP, Python, Ruby או Rust)
עיון בקבצים לדוגמה
מאגר הדוגמאות מכיל דוגמה שמראה איך להשתמש ב-Spanner עם database/sql.
עיינו בקובץgetting_started_guide.go, שבו מוסבר איך להשתמש ב-Spanner. הקוד מראה איך ליצור מסד נתונים חדש ולהשתמש בו. הנתונים משתמשים בסכימה לדוגמה שמוצגת בדף סכימה ומודל נתונים.
יצירת מסד נתונים
GoogleSQL
gcloud spanner databases create example-db --instance=test-instance
PostgreSQL
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
אמורה להופיע ההודעה:
Creating database...done.
יצירת טבלאות
הקוד הבא יוצר שתי טבלאות במסד הנתונים.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go createtables projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go createtablespg projects/PROJECT_ID/instances/test-instance/databases/example-db
השלב הבא הוא כתיבת נתונים במסד הנתונים.
יצירת חיבור
כדי לבצע פעולות קריאה או כתיבה, צריך ליצורsql.DB. sql.DB מכיל מאגר חיבורים שאפשר להשתמש בו כדי ליצור אינטראקציה עם Spanner. שם מסד הנתונים ומאפייני חיבור אחרים מצוינים בשם של מקור הנתונים של מסד הנתונים או ה-SQL.
GoogleSQL
PostgreSQL
כתיבת נתונים באמצעות DML
אפשר להוסיף נתונים באמצעות שפת טיפול בנתונים (DML) בטרנזקציית קריאה-כתיבה.
משתמשים בפונקציה ExecContext כדי להריץ פקודת DML.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go dmlwritepg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
4 records inserted.
כתיבת נתונים באמצעות מוטציות
אפשר גם להוסיף נתונים באמצעות מוטציות.
Mutation הוא מאגר של פעולות מוטציה. Mutation מייצגת רצף של הוספות, עדכונים ומחיקות ש-Spanner מחיל באופן אטומי על שורות וטבלאות שונות במסד נתונים של Spanner.
משתמשים ב-Mutation.InsertOrUpdate() כדי ליצור מוטציית INSERT_OR_UPDATE, שמוסיפה שורה חדשה או מעדכנת ערכי עמודות אם השורה כבר קיימת. לחלופין, אפשר להשתמש ב-Mutation.Insert() כדי ליצור מוטציה של INSERT שמוסיפה שורה חדשה.
conn.Raw כדי לקבל הפניה לחיבור הבסיסי של Spanner. הפונקציה SpannerConn.Apply מחילה מוטציות באופן אטומי על מסד הנתונים.
הקוד הבא מראה איך לכתוב את הנתונים באמצעות מוטציות:
GoogleSQL
PostgreSQL
מריצים את הדוגמה הבאה באמצעות הארגומנט write:
GoogleSQL
go run getting_started_guide.go write projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writepg projects/PROJECT_ID/instances/test-instance/databases/example-db
הרצת שאילתות על נתונים באמצעות SQL
Spanner תומך בממשק SQL לקריאת נתונים, שאפשר לגשת אליו בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות מנהל ההתקן של מסד הנתונים או ה-SQL של Spanner.
בשורת הפקודה
מריצים את הצהרת ה-SQL הבאה כדי לקרוא את הערכים של כל העמודות מהטבלה Albums:
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
תחביר Pipe ב-GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='FROM Albums |> SELECT SingerId, AlbumId, AlbumTitle'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
בתוצאה רואים:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
שימוש במנהל ההתקן של מסד הנתונים/SQL של Spanner
בנוסף להרצת הצהרת SQL בשורת הפקודה, אפשר להנפיק את אותה הצהרת SQL באופן פרוגרמטי באמצעות מנהל ההתקן של מסד הנתונים/SQL של Spanner.
הפונקציות והמבנים הבאים משמשים להרצת שאילתת SQL:- הפונקציה
QueryContextב-structDB: משתמשים בה כדי להריץ הצהרת SQL שמחזירה שורות, כמו שאילתה או פקודת DML עם סעיףTHEN RETURN. - המבנה
Rows: משמש כדי לגשת לנתונים שמוחזרים על ידי הצהרת SQL.
בדוגמה הבאה נעשה שימוש בפונקציה QueryContext:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go query projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querypg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
שאילתה באמצעות פרמטר SQL
אם באפליקציה שלכם יש שאילתה שמופעלת לעיתים קרובות, אתם יכולים לשפר את הביצועים שלה על ידי הוספת פרמטרים. אפשר לשמור במטמון את השאילתה הפרמטרית שנוצרה ולהשתמש בה שוב, וכך להפחית את עלויות ההידור. למידע נוסף, קראו את המאמר שימוש בפרמטרים של שאילתות כדי להאיץ שאילתות שמבוצעות לעיתים קרובות.
הנה דוגמה לשימוש בפרמטר בסעיף WHERE כדי לשלוח שאילתה על רשומות שמכילות ערך ספציפי של LastName.
מנהל ההתקן של מסד הנתונים/sql של Spanner תומך גם בפרמטרים של שאילתות לפי מיקום וגם בפרמטרים של שאילתות לפי שם. הסימן ? בהצהרת SQL מציין פרמטר של שאילתה לפי מיקום. מעבירים את ערכי הפרמטרים של השאילתה כארגומנטים נוספים לפונקציה QueryContext. לדוגמה:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querywithparameterpg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
12 Melissa Garcia
עדכון הסכימה של מסד הנתונים
נניח שאתם צריכים להוסיף עמודה חדשה בשם MarketingBudget לטבלה Albums. כדי להוסיף עמודה חדשה לטבלה קיימת, צריך לעדכן את הסכימה של מסד הנתונים. ב-Spanner אפשר לעדכן את הסכימה של מסד הנתונים בזמן שמסד הנתונים ממשיך לשרת את התנועה. עדכוני סכימה לא דורשים להעביר את מסד הנתונים למצב אופליין, והם לא נועלים טבלאות או עמודות שלמות. אפשר להמשיך לכתוב נתונים במסד הנתונים במהלך עדכון הסכימה. במאמר עדכוני סכימה מוסבר איך לעדכן סכימות ואיך השינויים בסכימה משפיעים על הביצועים.
הוספת עמודה
אפשר להוסיף עמודה בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות מנהל ההתקן של מסד הנתונים/SQL של Spanner.
בשורת הפקודה
משתמשים בפקודה הבאה של ALTER TABLE כדי להוסיף את העמודה החדשה לטבלה:
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='alter table albums add column marketing_budget bigint'
אמורה להופיע ההודעה:
Schema updating...done.
שימוש במנהל ההתקן של מסד הנתונים/SQL של Spanner
משתמשים בפונקציהExecContext כדי לשנות את הסכימה:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go addcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go addcolumnpg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
Added MarketingBudget column.
הפעלת אצווה של DDL
מומלץ לבצע כמה שינויים בסכימה באצווה אחת. משתמשים בפקודות START BATCH DDL ו-RUN BATCH כדי להריץ אצווה של DDL. בדוגמה הבאה נוצרות שתי טבלאות באצווה אחת:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go ddlbatch projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go ddlbatchpg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
Added Venues and Concerts tables.
כתיבת נתונים בעמודה החדשה
הקוד הבא כותב נתונים בעמודה החדשה. היא מגדירה את MarketingBudget לערך 100000 בשורה עם מפתח השורה Albums(1, 1), ולערך 500000 בשורה עם מפתח השורה Albums(2, 2).
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go update projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go updatepg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
Updated 2 albums
אפשר גם להריץ שאילתת SQL כדי לאחזר את הערכים שכתבתם.
בדוגמה הבאה משתמשים בפונקציה QueryContext כדי להריץ שאילתה:
GoogleSQL
PostgreSQL
כדי להריץ את השאילתה הזו, מריצים את הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go querymarketingbudget projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go querymarketingbudgetpg projects/PROJECT_ID/instances/test-instance/databases/example-db
אמורה להופיע ההודעה:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
עדכון נתונים
אפשר לעדכן נתונים באמצעות DML בעסקה של קריאה וכתיבה.
מפעילים את DB.BeginTx כדי לבצע עסקאות קריאה-כתיבה ב-database/sql.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go writewithtransactionusingdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go writewithtransactionusingdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
תגי עסקה ותגי בקשה
כדי לפתור בעיות בטרנזקציות ובשאילתות ב-Spanner, אפשר להשתמש בתגי טרנזקציות ותגי בקשות. אפשר להעביר אפשרויות נוספות של טרנזקציות לפונקציה spannerdriver.BeginReadWriteTransaction.
אפשר להשתמש ב-spannerdriver.ExecOptions כדי להעביר אפשרויות נוספות של שאילתות להצהרת SQL. לדוגמה:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go tags projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go tagspg projects/PROJECT_ID/instances/test-instance/databases/example-db
אחזור נתונים באמצעות עסקאות לקריאה בלבד
נניח שאתם רוצים לבצע יותר מקריאה אחת באותה חותמת זמן. עסקאות לקריאה בלבד צופות בתחילית עקבית של היסטוריית ה-commit של העסקה, כך שהאפליקציה תמיד מקבלת נתונים עקביים.
מגדירים את השדה TxOptions.ReadOnly לערך true כדי לבצע טרנזקציה לקריאה בלבד.
כך מריצים שאילתה ומבצעים קריאה באותה עסקה לקריאה בלבד:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go readonlytransactionpg projects/PROJECT_ID/instances/test-instance/databases/example-db
בתוצאה רואים:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
שאילתות מחולקות למחיצות ו-Data Boost
partitionQuery API מחלק שאילתה לחלקים קטנים יותר, או למחיצות, ומשתמש במספר מכונות כדי לאחזר את המחיצות במקביל. כל מחיצה מזוהה באמצעות אסימון מחיצה. ל-partitionQuery API יש זמן אחזור ארוך יותר מאשר ל-query API הרגיל, כי הוא מיועד רק לפעולות בכמות גדולה, כמו ייצוא או סריקה של מסד הנתונים כולו.
בעזרת Data Boost אתם יכולים להריץ שאילתות של ניתוח נתונים ולייצא נתונים בלי להשפיע על עומסי העבודה הקיימים במכונה המוקצית של Spanner. התכונה Data Boost תומכת רק בשאילתות מחולקות למחיצות.
הדוגמה הבאה ממחישה איך להריץ שאילתה מחולקת למחיצות באמצעות Data Boost עם מנהל ההתקן database/sql:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go databoost projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go databoostpg projects/PROJECT_ID/instances/test-instance/databases/example-db
DML מחולק למחיצות
שפת הטיפול בנתונים (DML) מחולקים למחיצות מיועדת לסוגים הבאים של עדכונים ומחיקות בכמות גדולה:
- ניקיון תקופתי ואיסוף אשפה.
- מילוי עמודות חדשות בערכי ברירת מחדל.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
go run getting_started_guide.go pdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
go run getting_started_guide.go pdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון לחיוב ב-Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם צריכים למחוק את מסד הנתונים ואת המכונה שיצרתם.
מחיקת מסד הנתונים
אם מוחקים מכונה, כל מסדי הנתונים שבתוכה נמחקים באופן אוטומטי. בשלב הזה מוסבר איך למחוק מסד נתונים בלי למחוק מכונה (עדיין תחויבו על המכונה).
בשורת הפקודה
gcloud spanner databases delete example-db --instance=test-instance
באמצעות מסוף Google Cloud
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המופע.
לוחצים על מסד הנתונים שרוצים למחוק.
בדף Database details, לוחצים על Delete.
מאשרים שרוצים למחוק את מסד הנתונים ולוחצים על מחיקה.
מחיקת המכונה
מחיקת מכונה גורמת להסרה אוטומטית של כל מסדי הנתונים שנוצרו בה.
בשורת הפקודה
gcloud spanner instances delete test-instance
באמצעות מסוף Google Cloud
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המכונה.
לוחצים על Delete.
מאשרים שרוצים למחוק את המכונה ולוחצים על Delete.
המאמרים הבאים
במאמר אימות לשירותי Cloud באמצעות ספריות לקוח תוכלו לקרוא מידע נוסף על פרטי כניסה לאימות ולהרשאה.