מטרות
במדריך הזה נסביר איך לבצע את השלבים הבאים באמצעות ספריית הלקוח Spanner ל-C#:
- יוצרים מכונה ומסד נתונים ב-Spanner.
- לכתוב, לקרוא ולהריץ שאילתות SQL על נתונים במסד הנתונים.
- מעדכנים את הסכימה של מסד הנתונים.
- עדכון נתונים באמצעות טרנזקציה של קריאה וכתיבה.
- מוסיפים אינדקס משני למסד הנתונים.
- השימוש באינדקס מאפשר לקרוא ולהריץ שאילתות SQL על נתונים.
- אחזור נתונים באמצעות טרנזקציה לקריאה בלבד.
עלויות
במדריך הזה נעשה שימוש ב-Spanner, שהוא רכיב בתשלום שלGoogle Cloud. מידע על עלות השימוש ב-Spanner מופיע בקטע תמחור.
לפני שמתחילים
צריך לבצע את השלבים שמפורטים במאמר הגדרה, שכוללים יצירה והגדרה של פרויקט ברירת מחדל Google Cloud , הפעלת החיוב, הפעלת Cloud Spanner API והגדרת OAuth 2.0 כדי לקבל אישורי אימות לשימוש ב-Cloud Spanner API.
בפרט, חשוב להריץ את הפקודה gcloud auth
application-default login כדי להגדיר את סביבת הפיתוח המקומית עם פרטי אימות.
הכנת סביבת C# מקומית
מגדירים את משתנה הסביבה
PROJECT_IDלמזהה הפרויקט ב- Google Cloud .קודם כול, מגדירים את
PROJECT_IDלסשן הנוכחי של PowerShell:$env:PROJECT_ID = "MY_PROJECT_ID"
לאחר מכן, מגדירים את
PROJECT_IDלכל התהליכים שנוצרו אחרי הפקודה הזו:[Environment]::SetEnvironmentVariable("PROJECT_ID", "MY_PROJECT_ID", "User")
מורידים את פרטי הכניסה.
נכנסים לדף Credentials במסוף Google Cloud .
לוחצים על Create credentials ובוחרים באפשרות Service account key.
בקטע 'חשבון שירות', בוחרים באפשרות חשבון שירות ברירת המחדל של Compute Engine, ומשאירים את האפשרות JSON מסומנת בקטע 'סוג המפתח'. לוחצים על יצירה. קובץ JSON יורד למחשב.
מגדירים פרטי כניסה. כדי להגדיר את
GOOGLE_APPLICATION_CREDENTIALSכך שיצביע על מפתח ה-JSON של קובץ בשםFILENAME.jsonבספריית ההורדות שלCURRENT_USER, שנמצא בכונןC, מריצים את הפקודות הבאות:קודם כול, כדי להגדיר את
GOOGLE_APPLICATION_CREDENTIALSעבור סשן PowerShell הזה:$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\Users\CURRENT_USER\Downloads\FILENAME.json"
לאחר מכן, כדי להגדיר את
GOOGLE_APPLICATION_CREDENTIALSלכל התהליכים שנוצרו אחרי הפקודה הזו:[Environment]::SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "C:\Users\CURRENT_USER\Downloads\FILENAME.json", "User")
משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samplesאפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.
פותחים את
Spanner.sln, שנמצא בספרייהdotnet-docs-samples\spanner\apiשל המאגר שהורדתם, באמצעות Visual Studio 2017 ואילך, ואז בונים אותו.עוברים לספרייה במאגר שהורדתם שמכילה את האפליקציה שעברה קומפילציה. לדוגמה:
cd dotnet-docs-samples\spanner\api\Spanner
יצירת מופע
בפעם הראשונה שמשתמשים ב-Spanner, צריך ליצור מופע, שהוא הקצאה של משאבים שמשמשים מסדי נתונים של Spanner. כשיוצרים מופע, בוחרים הגדרת מופע, שקובעת איפה הנתונים מאוחסנים, וגם את מספר הצמתים לשימוש, שקובע את כמות משאבי ההגשה והאחסון במופע.
במאמר יצירת מכונה מוסבר איך ליצור מכונת Spanner באמצעות אחת מהשיטות הבאות. אפשר לתת למופע שם test-instance כדי להשתמש בו עם נושאים אחרים במסמך הזה שמפנים למופע בשם test-instance.
- Google Cloud CLI
- מסוף Google Cloud
- ספריית לקוח (C++, C#, Go, Java, Node.js, PHP, Python או Ruby)
עיון בקבצים לדוגמה
מאגר הדוגמאות מכיל דוגמה שמראה איך להשתמש ב-Spanner עם C#.
אפשר לעיין במאגר Spanner .NET ב-GitHub כדי לראות איך יוצרים מסד נתונים ומשנים סכימת מסד נתונים. הנתונים משתמשים בסכימה לדוגמה שמוצגת בדף סכימה ומודל נתונים.
יצירת מסד נתונים
הפרטים שמוצגים הם:
הקוד הבא יוצר מסד נתונים ושתי טבלאות במסד הנתונים.GoogleSQL
PostgreSQL
השלב הבא הוא כתיבת נתונים למסד הנתונים.
יצירת לקוח מסד נתונים
לפני שתוכלו לבצע פעולות קריאה או כתיבה, תצטרכו ליצור
SpannerConnection:
אפשר לחשוב על SpannerConnection כעל חיבור למסד נתונים: כל האינטראקציות עם Spanner חייבות לעבור דרך SpannerConnection.
מידע נוסף זמין במאמר בנושא
SpannerConnection.
כתיבת נתונים באמצעות DML
אפשר להוסיף נתונים באמצעות שפת טיפול בנתונים (DML) בעסקת קריאה-כתיבה.
משתמשים ב-ExecuteNonQueryAsync() method כדי להריץ פקודת DML.
מריצים את הדוגמה באמצעות הארגומנט writeUsingDml.
dotnet run writeUsingDml $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
4 row(s) inserted...
כתיבת נתונים באמצעות מוטציות
אפשר גם להוסיף נתונים באמצעות מוטציות.
אפשר להוסיף נתונים באמצעות השיטה
connection.CreateInsertCommand()
שיוצרת SpannerCommand חדש כדי להוסיף שורות לטבלה. השיטה
SpannerCommand.ExecuteNonQueryAsync()
מוסיפה שורות חדשות לטבלה.
בדוגמת הקוד הזו אפשר לראות איך להוסיף נתונים באמצעות מוטציות:
מריצים את הדוגמה באמצעות הארגומנט insertSampleData.
dotnet run insertSampleData $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
Inserted data.
הרצת שאילתות על נתונים באמצעות SQL
Spanner תומך בממשק SQL לקריאת נתונים, שאפשר לגשת אליו בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-C#.
בשורת הפקודה
מריצים את הצהרת ה-SQL הבאה כדי לקרוא את הערכים של כל העמודות מהטבלה Albums:
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle 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 ל-C#
בנוסף להרצת הצהרת SQL בשורת הפקודה, אפשר להנפיק את אותה הצהרת SQL באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-C#.
משתמשים ב-ExecuteReaderAsync()
כדי להריץ את שאילתת ה-SQL.
כך מריצים את השאילתה וניגשים לנתונים:
dotnet run querySampleData $env:PROJECT_ID test-instance example-db
אמורה להתקבל התוצאה הבאה:
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
כך מריצים את השאילתה עם פרמטר וניגשים לנתונים:
dotnet run queryWithParameter $env:PROJECT_ID test-instance example-db
אמורה להתקבל התוצאה הבאה:
SingerId : 12 FirstName : Melissa LastName : Garcia
עדכון הסכימה של מסד הנתונים
נניח שאתם רוצים להוסיף עמודה חדשה בשם MarketingBudget לטבלה Albums. כדי להוסיף עמודה חדשה לטבלה קיימת, צריך לעדכן את סכימת מסד הנתונים. מערכת Spanner תומכת בעדכוני סכימה במסד נתונים בזמן שמסד הנתונים ממשיך לשרת תנועה. עדכוני סכימה לא מחייבים להעביר את מסד הנתונים למצב אופליין, והם לא נועלים טבלאות או עמודות שלמות. אתם יכולים להמשיך לכתוב נתונים למסד הנתונים במהלך עדכון הסכימה. מידע נוסף על עדכוני סכימה נתמכים ועל ביצועים של שינויים בסכימה זמין במאמר ביצוע עדכונים בסכימה.
הוספת עמודה
אפשר להוסיף עמודה בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-C#.
בשורת הפקודה
כדי להוסיף את העמודה החדשה לטבלה, משתמשים בפקודה 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 ל-C#
משתמשים ב-CreateDdlCommand() כדי לשנות את הסכימה:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה addColumn.
dotnet run addColumn $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
Added the MarketingBudget column.
כתיבת נתונים בעמודה החדשה
הקוד הבא כותב נתונים בעמודה החדשה. הפונקציה מגדירה את MarketingBudget ל-100000 בשורה עם מפתח Albums(1, 1), ול-500000 בשורה עם מפתח Albums(2, 2).
מריצים את הדוגמה באמצעות הפקודה writeDataToNewColumn.
dotnet run writeDataToNewColumn $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
Updated data.
אפשר גם להריץ שאילתת SQL כדי לאחזר את הערכים שכתבתם.
הנה הקוד להרצת השאילתה:
כדי להריץ את השאילתה הזו, מריצים את הדוגמה באמצעות הארגומנט queryNewColumn.
dotnet run queryNewColumn $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
SingerId : 1 AlbumId : 1 MarketingBudget : 100000
SingerId : 1 AlbumId : 2 MarketingBudget :
SingerId : 2 AlbumId : 1 MarketingBudget :
SingerId : 2 AlbumId : 2 MarketingBudget : 500000
SingerId : 2 AlbumId : 3 MarketingBudget :
עדכון נתונים
אפשר לעדכן נתונים באמצעות DML בעסקת קריאה-כתיבה.
משתמשים ב-ExecuteNonQueryAsync() method כדי להריץ פקודת DML.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הארגומנט writeWithTransactionUsingDml.
dotnet run writeWithTransactionUsingDml $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
Transaction complete.
שימוש באינדקס משני
נניח שרוצים לאחזר את כל השורות של Albums שיש להן ערכים של AlbumTitle בטווח מסוים. אפשר לקרוא את כל הערכים מהעמודה AlbumTitle באמצעות הצהרת SQL או קריאת קובץ, ואז להשליך את השורות שלא עומדות בקריטריונים. אבל סריקה מלאה של הטבלה היא פעולה יקרה, במיוחד בטבלאות עם הרבה שורות. במקום זאת, אפשר להאיץ את אחזור השורות כשמחפשים לפי עמודות שאינן מפתח ראשי, על ידי יצירת אינדקס משני בטבלה.
כדי להוסיף אינדקס משני לטבלה קיימת, צריך לעדכן את הסכימה. בדומה לעדכוני סכימה אחרים, Spanner תומך בהוספת אינדקס בזמן שהמסד נתונים ממשיך להעביר תנועה. Spanner ממלא באופן אוטומטי את האינדקס בנתונים הקיימים. יכול להיות שיחלפו כמה דקות עד שהמילוי יסתיים, אבל לא צריך להעביר את מסד הנתונים למצב אופליין או להימנע מכתיבה לטבלה המאונדקסת במהלך התהליך הזה. פרטים נוספים זמינים במאמר בנושא הוספת אינדקס משני.
אחרי שמוסיפים אינדקס משני, Spanner משתמש בו באופן אוטומטי לשאילתות SQL שסביר שיפעלו מהר יותר עם האינדקס. אם משתמשים בממשק הקריאה, צריך לציין את האינדקס שרוצים להשתמש בו.
הוספת אינדקס משני
אפשר להוסיף אינדקס בשורת הפקודה באמצעות ה-CLI של gcloud או באופן פרוגרמטי באמצעות ספריית הלקוח של Spanner ל-C#.
בשורת הפקודה
משתמשים בפקודה CREATE INDEX הבאה כדי להוסיף אינדקס למסד הנתונים:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='CREATE INDEX AlbumsByAlbumTitle ON Albums(AlbumTitle)'
הפרטים שמוצגים הם:
Schema updating...done.
שימוש בספריית הלקוח של Spanner עבור C#
כדי להוסיף אינדקס, משתמשים ב-CreateDdlCommand():
מריצים את הדוגמה באמצעות הפקודה addIndex.
dotnet run addIndex $env:PROJECT_ID test-instance example-db
הוספת אינדקס יכולה להימשך כמה דקות. אחרי שהאינדקס יתווסף, יוצגו לכם:
Added the AlbumsByAlbumTitle index.
הוספת אינדקס לקריאות של אינדקס בלבד
יכול להיות ששמתם לב שבדוגמה הקודמת של קריאה לא נכללת קריאה של העמודה 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 עבור C#
משתמשים בפקודהCreateDdlCommand()
כדי להוסיף אינדקס עם פסקה STORING:
מריצים את הדוגמה באמצעות הפקודה addStoringIndex.
dotnet run addStoringIndex $env:PROJECT_ID test-instance example-db
הפרטים שמוצגים הם:
Added the AlbumsByAlbumTitle2 index.
עכשיו אפשר להריץ קריאה שמביאה את כל העמודות AlbumId, AlbumTitle ו-MarketingBudget מהאינדקס AlbumsByAlbumTitle2:
כדי לקרוא נתונים באמצעות אינדקס האחסון שיצרתם, מריצים שאילתה שמציינת במפורש את האינדקס:
מריצים את הדוגמה באמצעות הפקודה queryDataWithStoringIndex.
dotnet run queryDataWithStoringIndex $env:PROJECT_ID test-instance example-db
הפלט אמור להיראות כך:
AlbumId : 2 AlbumTitle : Forever Hold your Peace MarketingBudget : 300000
AlbumId : 2 AlbumTitle : Go, Go, Go MarketingBudget : 300000
אחזור נתונים באמצעות טרנזקציות לקריאה בלבד
נניח שרוצים לבצע יותר מקריאה אחת באותה חותמת זמן. עסקאות לקריאה בלבד מתבססות על קידומת עקבית של היסטוריית אישור העסקאות, כך שהאפליקציה תמיד מקבלת נתונים עקביים.
כדי להריץ עסקאות לקריאה בלבד, משתמשים ב-TransactionScope() של .NET framework יחד עם OpenAsReadOnlyAsync().
בדוגמה הבאה מוצג איך להריץ שאילתה ולבצע קריאה באותה טרנזקציה לקריאה בלבד:
.NET Standard 2.0
.NET Standard 1.5
מריצים את הדוגמה באמצעות הפקודה queryDataWithTransaction.
dotnet run queryDataWithTransaction $env:PROJECT_ID test-instance example-db
הפלט אמור להיראות כך:
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 : 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
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון לחיוב ב-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.
מאשרים שרוצים למחוק את המופע ולוחצים על מחיקה.
המאמרים הבאים
- אפשר לנסות את גרסת הטרום-השקה של ספק מסד הנתונים של Spanner ל-Entity Framework Core.
במאמר אימות לשירותי Cloud באמצעות ספריות לקוח מוסבר על הרשאות ופרטי אימות.