מטרות
במדריך הזה נסביר איך לבצע את השלבים הבאים באמצעות מנהל ההתקן של Spanner database/sql:
- יוצרים מכונה ומסד נתונים ב-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)
עיון בקבצים לדוגמה
מאגר הדוגמאות מכיל דוגמה שמראה איך להשתמש ב-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'
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במבנהDB: משתמשים בה כדי להריץ הצהרת 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
אחזור נתונים באמצעות טרנזקציות לקריאה בלבד
נניח שרוצים לבצע יותר מקריאה אחת באותה חותמת זמן. עסקאות לקריאה בלבד מתבססות על קידומת עקבית של היסטוריית אישור העסקאות, כך שהאפליקציה תמיד מקבלת נתונים עקביים.
מגדירים את השדה 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
ממשק ה-API partitionQuery מחלק שאילתה לחלקים קטנים יותר, או למחיצות, ומשתמש בכמה מכונות כדי לאחזר את המחיצות במקביל. כל מחיצה מזוהה באמצעות אסימון מחיצה. ההשהיה ב-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
Partitioned DML
שפת טיפול בנתונים (DML) עם חלוקה למחיצות מיועדת לסוגים הבאים של עדכונים ומחיקות בכמות גדולה:
- ניקוי תקופתי ו-garbage collection.
- מילוי חוזר של עמודות חדשות בערכי ברירת מחדל.
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 .
לוחצים על המופע.
לוחצים על מסד הנתונים שרוצים למחוק.
בדף פרטי מסד הנתונים, לוחצים על מחיקה.
מאשרים שרוצים למחוק את מסד הנתונים ולוחצים על מחיקה.
מחיקת המכונה
מחיקת מופע תגרום להסרה אוטומטית של כל מסדי הנתונים שנוצרו במופע הזה.
בשורת הפקודה
gcloud spanner instances delete test-instance
שימוש במסוף Google Cloud
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המופע.
לוחצים על Delete.
מאשרים שרוצים למחוק את המופע ולוחצים על מחיקה.
המאמרים הבאים
במאמר אימות לשירותי Cloud באמצעות ספריות לקוח מוסבר על הרשאות ופרטי אימות.