מטרות
במדריך הזה נסביר איך לבצע את השלבים הבאים באמצעות מנהל ההתקן של 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
שימוש במסד נתונים של Spanner או במנהל התקן של SQL
בנוסף להרצת הצהרת 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.
שימוש במסד נתונים של Spanner או במנהל התקן של SQL
משתמשים בפונקציה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 מחלק שאילתה לחלקים קטנים יותר, או למחיצות, ומשתמש בכמה מכונות כדי לאחזר את המחיצות במקביל. כל מחיצה מזוהה באמצעות אסימון מחיצה. החביון (latency) של 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) עם חלוקה למחיצות מיועדת לסוגים הבאים של עדכונים ומחיקות בכמות גדולה:
- ניקיון תקופתי ואיסוף אשפה.
- מילוי חוזר של עמודות חדשות בערכי ברירת מחדל.
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 באמצעות ספריות לקוח תוכלו לקרוא מידע נוסף על הרשאות ופרטי כניסה לאימות.