מטרות
במדריך הזה נסביר איך לבצע את הפעולות הבאות באמצעות ספריית הלקוח של Spanner ל-Node.js:
- יוצרים מכונה ומסד נתונים ב-Spanner.
- לכתוב, לקרוא ולהריץ שאילתות SQL על נתונים במסד הנתונים.
- מעדכנים את הסכימה של מסד הנתונים.
- עדכון נתונים באמצעות טרנזקציית קריאה-כתיבה.
- מוסיפים אינדקס משני למסד הנתונים.
- משתמשים באינדקס כדי לקרוא ולהריץ שאילתות SQL על נתונים.
- אחזור נתונים באמצעות טרנזקציה לקריאה בלבד.
עלויות
במדריך הזה משתמשים ב-Spanner, רכיב שלGoogle Cloudשהשימוש בו כרוך בתשלום. למידע על עלות השימוש ב-Spanner, ראו תמחור.
לפני שמתחילים
מבצעים את השלבים שמפורטים בקטע הגדרה, שכוללים יצירה והגדרה של פרויקט Google Cloud כברירת מחדל, הפעלת החיוב, הפעלת Cloud Spanner API והגדרת OAuth 2.0 כדי לקבל פרטי כניסה לאימות לשימוש ב-Cloud Spanner API.
חשוב במיוחד להריץ את הפקודה gcloud auth
application-default login כדי להגדיר את סביבת הפיתוח המקומית עם פרטי כניסה לאימות.
הכנת סביבת Node.js המקומית
פועלים לפי השלבים להגדרת סביבת פיתוח ב-Node.js.
משכפלים את המאגר של האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.gitאפשר גם להוריד את הדוגמה כקובץ ZIP ולחלץ אותו.
עוברים לספרייה שמכילה את הקוד לדוגמה של Spanner:
cd nodejs-docs-samples/spanner/מתקינים את יחסי התלות באמצעות
npm:npm install
יצירת מכונה
בפעם הראשונה שמשתמשים ב-Spanner, צריך ליצור מכונה – הקצאה של משאבים שמשמשים את מסדי הנתונים של Spanner. כשיוצרים מכונה, בוחרים הגדרת מכונה שקובעת איפה הנתונים יאוחסנו, וגם את מספר הצמתים שבהם משתמשים, שקובע את כמות משאבי האחסון וההצגה במכונה.
במאמר יצירת מכונה מוסבר איך ליצור מכונה של Spanner באמצעות אחת מהשיטות הבאות. אפשר לתת למכונה את השם test-instance כדי להשתמש בה עם נושאים אחרים במסמך הזה, שמתייחסים למכונה בשם test-instance.
- Google Cloud CLI
- מסוף Google Cloud
- ספריית לקוח (C++, C#, Go, Java, Node.js, PHP, Python, Ruby או Rust)
עיון בקבצים לדוגמה
מאגר הדוגמאות מכיל דוגמה שמראה איך להשתמש ב-Spanner עם Node.js.
עיינו בקובץ samples/schema.js, שבו מוסבר איך ליצור מסד נתונים ולשנות סכימה של מסד נתונים. הנתונים משתמשים בסכימה לדוגמה שמוצגת בדף סכימה ומודל נתונים.
יצירת מסד נתונים
GoogleSQL
node schema.js createDatabase test-instance example-db MY_PROJECT_ID
PostgreSQL
node schema.js createPgDatabase test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
Created database example-db on instance test-instance.
GoogleSQL
PostgreSQL
השלב הבא הוא כתיבת נתונים במסד הנתונים.
יצירת לקוח של מסד נתונים
כדי לבצע פעולות קריאה או כתיבה, צריך ליצורDatabase:
אפשר לחשוב על Database כחיבור למסד נתונים: כל האינטראקציות עם Spanner חייבות לעבור דרך Database. בדרך כלל יוצרים Database כשהאפליקציה מופעלת, ואז משתמשים שוב באותו Database כדי לקרוא, לכתוב ולבצע טרנזקציות. כל לקוח משתמש במשאבים ב-Spanner.
אם אתם יוצרים כמה לקוחות באותה אפליקציה, כדאי להפעיל את Database.close() כדי לנקות את המשאבים של הלקוח, כולל חיבורים לרשת, ברגע שהם לא נחוצים יותר.
מידע נוסף זמין במאמר העזר בנושא Database.
כתיבת נתונים באמצעות DML
אפשר להוסיף נתונים באמצעות שפת טיפול בנתונים (DML) בטרנזקציית קריאה-כתיבה.
משתמשים ב-method runUpdate() כדי להריץ פקודת DML.
מריצים את הדוגמה באמצעות הארגומנט writeUsingDml.
node dml.js writeUsingDml test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
4 records inserted.
כתיבת נתונים באמצעות מוטציות
אפשר גם להוסיף נתונים באמצעות מוטציות.
כדי לכתוב נתונים, משתמשים באובייקט Table. ה-method Table.insert() מוסיפה שורות חדשות לטבלה. כל ההוספות באצווה אחת מיושמות באופן אטומי.
הקוד הזה מראה איך לכתוב את הנתונים באמצעות מוטציות:
מריצים את הדוגמה באמצעות הארגומנט insert.
node crud.js insert test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
Inserted data.
הרצת שאילתות על נתונים באמצעות SQL
Spanner תומך בממשק SQL לקריאת נתונים, שאפשר לגשת אליו בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-Node.js.
בשורת הפקודה
מריצים את הצהרת ה-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'
בתוצאה רואים:
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 ל-Node.js
בנוסף להרצה של הצהרת SQL בשורת הפקודה, אתם יכולים להנפיק את אותה הצהרת SQL באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-Node.js.
משתמשים ב-Database.run() כדי להריץ את שאילתת ה-SQL.
כך מריצים את השאילתה וניגשים לנתונים:
node crud.js query test-instance example-db MY_PROJECT_ID
התוצאה הבאה אמורה להופיע:
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold your Peace
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
שאילתה באמצעות פרמטר SQL
אם באפליקציה שלכם יש שאילתה שמופעלת לעיתים קרובות, אתם יכולים לשפר את הביצועים שלה על ידי הוספת פרמטרים. אפשר לשמור במטמון את השאילתה הפרמטרית שנוצרה ולהשתמש בה שוב, וכך להפחית את עלויות ההידור. למידע נוסף, קראו את המאמר שימוש בפרמטרים של שאילתות כדי להאיץ שאילתות שמבוצעות לעיתים קרובות.
הנה דוגמה לשימוש בפרמטר בסעיף WHERE כדי לשלוח שאילתה על רשומות שמכילות ערך ספציפי של LastName.
GoogleSQL
PostgreSQL
כך מריצים את השאילתה וניגשים לנתונים:
node dml.js queryWithParameter test-instance example-db MY_PROJECT_ID
התוצאה הבאה אמורה להופיע:
SingerId: 12, FirstName: Melissa, LastName: Garcia
קריאת נתונים באמצעות Read API
בנוסף לממשק ה-SQL של Spanner, יש גם ממשק קריאה.
כדי לקרוא שורות ממסד הנתונים, משתמשים ב-Table.read(). משתמשים באובייקט KeySet כדי להגדיר אוסף של מפתחות וטווחי מפתחות לקריאה.
כך קוראים את הנתונים:
מריצים את הדוגמה באמצעות הארגומנט read.
node crud.js read test-instance example-db MY_PROJECT_ID
הפלט אמור להיראות כך:
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold your Peace
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
עדכון הסכימה של מסד הנתונים
נניח שאתם צריכים להוסיף עמודה חדשה בשם MarketingBudget לטבלה Albums. כדי להוסיף עמודה חדשה לטבלה קיימת, צריך לעדכן את הסכימה של מסד הנתונים. ב-Spanner אפשר לעדכן את הסכימה של מסד הנתונים בזמן שמסד הנתונים ממשיך לשרת את התנועה. עדכוני סכימה לא דורשים להעביר את מסד הנתונים למצב אופליין, והם לא נועלים טבלאות או עמודות שלמות. אפשר להמשיך לכתוב נתונים במסד הנתונים במהלך עדכון הסכימה. במאמר עדכוני סכימה מוסבר איך לעדכן סכימות ואיך השינויים בסכימה משפיעים על הביצועים.
הוספת עמודה
אפשר להוסיף עמודה בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-Node.js.
בשורת הפקודה
משתמשים בפקודה הבאה של 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 MarketingBudget BIGINT'
אמורה להופיע ההודעה:
Schema updating...done.
שימוש בספריית הלקוח של Spanner ל-Node.js
משתמשים ב-Database.updateSchema כדי לשנות את הסכימה:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הארגומנט addColumn.
node schema.js addColumn test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
Added the MarketingBudget column.
כתיבת נתונים בעמודה החדשה
הקוד הבא כותב נתונים בעמודה החדשה. היא מגדירה את MarketingBudget לערך 100000 בשורה עם מפתח השורה Albums(1, 1), ולערך 500000 בשורה עם מפתח השורה Albums(2, 2).
מריצים את הדוגמה באמצעות הארגומנט update.
node crud.js update test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
Updated data.
אפשר גם להריץ שאילתת SQL או קריאת קריאה כדי לאחזר את הערכים שכתבתם.
זה הקוד להרצת השאילתה:
כדי להריץ את השאילתה הזו, מריצים את הדוגמה באמצעות הארגומנט queryNewColumn.
node schema.js queryNewColumn test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
SingerId: 1, AlbumId: 1, MarketingBudget: 100000
SingerId: 1, AlbumId: 2, MarketingBudget: null
SingerId: 2, AlbumId: 1, MarketingBudget: null
SingerId: 2, AlbumId: 2, MarketingBudget: 500000
SingerId: 2, AlbumId: 3, MarketingBudget: null
עדכון נתונים
אפשר לעדכן נתונים באמצעות DML בעסקה של קריאה וכתיבה.
משתמשים ב-method runUpdate() כדי להריץ פקודת DML.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הארגומנט writeWithTransactionUsingDml.
node dml.js writeWithTransactionUsingDml test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
Successfully executed read-write transaction using DML to transfer $200000 from Album 2 to Album 1.
שימוש באינדקס משני
נניח שאתם רוצים לאחזר את כל השורות של Albums שיש בהן ערכי AlbumTitle בטווח מסוים. אפשר לקרוא את כל הערכים מהעמודה AlbumTitle באמצעות הצהרת SQL או קריאה, ואז למחוק את השורות שלא עומדות בקריטריונים. עם זאת, סריקה של כל הטבלה היא פעולה יקרה, במיוחד בטבלאות עם הרבה שורות. במקום זאת, כדי לאחזר שורות מהר יותר כשמחפשים לפי עמודות שהן לא מפתח ראשי, אפשר ליצור אינדקס משני בטבלה.
כדי להוסיף אינדקס משני לטבלה קיימת, צריך לעדכן את הסכימה. כמו עדכוני סכימה אחרים, Spanner תומך בהוספת אינדקס בזמן שמסד הנתונים ממשיך לשרת את התנועה. Spanner ממלא באופן אוטומטי את החוסרים באינדקס באמצעות הנתונים הקיימים. מילויים חוזרים עשויים להימשך כמה דקות, אבל לא צריך להעביר את מסד הנתונים למצב אופליין או להימנע מכתיבה בטבלה שנוסף לה אינדקס במהלך התהליך הזה. למידע נוסף, קראו את המאמר הוספת אינדקס משני.
אחרי שמוסיפים אינדקס משני, Spanner משתמש בו באופן אוטומטי לשאילתות SQL שסביר להניח שיפעלו מהר יותר עם האינדקס. אם אתם משתמשים בממשק הקריאה, אתם צריכים לציין את האינדקס שבו אתם רוצים להשתמש.
הוספת אינדקס משני
אפשר להוסיף אינדקס בשורת הפקודה באמצעות ה-CLI של gcloud, או באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-Node.js.
בשורת הפקודה
משתמשים בפקודה הבאה של CREATE INDEX כדי להוסיף אינדקס למסד הנתונים:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
אמורה להופיע ההודעה:
Schema updating...done.
שימוש בספריית הלקוח של Spanner ל-Node.js
משתמשים ב-Database.updateSchema() כדי להוסיף אינדקס:
מריצים את הדוגמה באמצעות הארגומנט createIndex.
node indexing.js createIndex test-instance example-db MY_PROJECT_ID
הוספת אינדקס יכולה להימשך כמה דקות. אחרי שמוסיפים את האינדקס, אמור להופיע:
Added the AlbumsByAlbumTitle index.
קריאה באמצעות האינדקס
בשאילתות SQL, Spanner משתמש באופן אוטומטי באינדקס מתאים. בממשק הקריאה, צריך לציין את האינדקס בבקשה.
כדי להשתמש באינדקס בממשק הקריאה, משתמשים ב-method Table.read().
מריצים את הדוגמה באמצעות הארגומנט readIndex.
node indexing.js readIndex test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
AlbumId: 2, AlbumTitle: Forever Hold your Peace
AlbumId: 2, AlbumTitle: Go, Go, Go
AlbumId: 1, AlbumTitle: Green
AlbumId: 3, AlbumTitle: Terrified
AlbumId: 1, AlbumTitle: Total Junk
הוספת אינדקס לקריאות של אינדקס בלבד
אולי שמתם לב שבדוגמה הקודמת של קריאה לא נכללה קריאה של העמודה MarketingBudget. הסיבה לכך היא שממשק הקריאה של Spanner לא תומך באפשרות לצרף אינדקס לטבלת נתונים כדי לבצע חיפוש מהיר של ערכים שלא מאוחסנים באינדקס.
יוצרים הגדרה חלופית של AlbumsByAlbumTitle ששומרת עותק של MarketingBudget באינדקס.
בשורת הפקודה
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) STORING (MarketingBudget)
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle2 ON Albums(AlbumTitle) INCLUDE (MarketingBudget)
הוספת אינדקס יכולה להימשך כמה דקות. אחרי שמוסיפים את האינדקס, אמור להופיע:
Schema updating...done.
שימוש בספריית הלקוח של Spanner ל-Node.js
משתמשים ב-Database.updateSchema() כדי להוסיף אינדקס עם משפט STORING:
מריצים את הדוגמה באמצעות הארגומנט createStoringIndex.
node indexing.js createStoringIndex test-instance example-db MY_PROJECT_ID
אמורה להופיע ההודעה:
Added the AlbumsByAlbumTitle2 index.
עכשיו אפשר לבצע קריאה שמאחזרת את כל העמודות AlbumId, AlbumTitle ו-MarketingBudget מהאינדקס AlbumsByAlbumTitle2:
מריצים את הדוגמה באמצעות הארגומנט readStoringIndex.
node indexing.js readStoringIndex test-instance example-db MY_PROJECT_ID
הפלט אמור להיראות כך:
AlbumId: 2, AlbumTitle: Forever Hold your Peace, MarketingBudget: 300000
AlbumId: 2, AlbumTitle: Go, Go, Go, MarketingBudget: null
AlbumId: 1, AlbumTitle: Green, MarketingBudget: null
AlbumId: 3, AlbumTitle: Terrified, MarketingBudget: null
AlbumId: 1, AlbumTitle: Total Junk, MarketingBudget: 300000
אחזור נתונים באמצעות עסקאות לקריאה בלבד
נניח שאתם רוצים לבצע יותר מקריאה אחת באותה חותמת זמן. עסקאות לקריאה בלבד צופות בתחילית עקבית של היסטוריית ה-commit של העסקה, כך שהאפליקציה תמיד מקבלת נתונים עקביים.
משתמשים ב-Database.runTransaction() כדי לבצע טרנזקציות לקריאה בלבד.
כך מריצים שאילתה ומבצעים קריאה באותה עסקה לקריאה בלבד:
מריצים את הדוגמה באמצעות הארגומנט readOnly.
node transaction.js readOnly test-instance example-db MY_PROJECT_ID
הפלט אמור להיראות כך:
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold your Peace
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
Successfully executed read-only transaction.
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון לחיוב ב-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 באמצעות ספריות לקוח תוכלו לקרוא מידע נוסף על פרטי כניסה לאימות ולהרשאה.