১. সংক্ষিপ্ত বিবরণ
গুগল ক্লাউড স্প্যানার হলো একটি সম্পূর্ণভাবে পরিচালিত, হরাইজন্টালি স্কেলেবল, বিশ্বব্যাপী বিতরণযোগ্য রিলেশনাল ডাটাবেস পরিষেবা, যা পারফরম্যান্স ও উচ্চ প্রাপ্যতা বজায় রেখে ACID ট্রানজ্যাকশন এবং SQL সিম্যান্টিকস প্রদান করে।
এই ল্যাবে, আপনি একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করার পদ্ধতি শিখবেন। আপনি একটি গেমিং লিডারবোর্ডের জন্য ব্যবহারযোগ্য ডাটাবেস এবং স্কিমা তৈরির ধাপগুলো অনুসরণ করবেন। আপনি প্রথমে খেলোয়াড়দের তথ্য সংরক্ষণের জন্য একটি 'Players' টেবিল এবং খেলোয়াড়দের স্কোর সংরক্ষণের জন্য একটি 'Scores' টেবিল তৈরি করবেন।
এরপর আপনি নমুনা ডেটা দিয়ে টেবিলগুলো পূরণ করবেন। তারপর কয়েকটি সেরা দশটি নমুনা কোয়েরি চালিয়ে ল্যাবটি শেষ করবেন এবং সবশেষে রিসোর্স খালি করার জন্য ইনস্ট্যান্সটি ডিলিট করে দেবেন।
আপনি যা শিখবেন
- কীভাবে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করবেন।
- কিভাবে ডাটাবেস এবং টেবিল তৈরি করতে হয়।
- কমিট টাইমস্ট্যাম্প কলাম কীভাবে ব্যবহার করবেন
- টাইমস্ট্যাম্প সহ আপনার ক্লাউড স্প্যানার ডাটাবেস টেবিলে কীভাবে ডেটা লোড করবেন।
- আপনার ক্লাউড স্প্যানার ডাটাবেস কীভাবে কোয়েরি করবেন।
- আপনার ক্লাউড স্প্যানার ইনস্ট্যান্স কীভাবে ডিলিট করবেন।
আপনার যা যা লাগবে
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স ।
আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?
গুগল ক্লাউড প্ল্যাটফর্মের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?
২. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিতে পরিবেশ সেটআপ
আপনার যদি আগে থেকে কোনো গুগল অ্যাকাউন্ট (জিমেইল বা গুগল অ্যাপস) না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে। গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে ( console.cloud.google.com ) সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন।
আপনার যদি আগে থেকেই কোনো প্রজেক্ট থাকে, তাহলে কনসোলের উপরের বাম দিকের প্রজেক্ট সিলেকশন পুল-ডাউন মেনুতে ক্লিক করুন:

এবং একটি নতুন প্রজেক্ট তৈরি করতে, প্রাপ্ত ডায়ালগ বক্সে থাকা 'NEW PROJECT' বোতামটিতে ক্লিক করুন:

আপনার যদি আগে থেকে কোনো প্রজেক্ট না থাকে, তাহলে আপনার প্রথম প্রজেক্টটি তৈরি করার জন্য এইরকম একটি ডায়ালগ বক্স দেখতে পাবেন:

পরবর্তী প্রজেক্ট তৈরির ডায়ালগ বক্সে আপনি আপনার নতুন প্রজেক্টের বিবরণ লিখতে পারবেন:

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।
এরপরে, যদি আপনি আগে থেকে তা না করে থাকেন, তাহলে Google Cloud রিসোর্স ব্যবহার করতে এবং Cloud Spanner API সক্রিয় করতে আপনাকে ডেভেলপার কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে আপনার কয়েক ডলারের বেশি খরচ হওয়ার কথা নয়, কিন্তু আপনি যদি আরও রিসোর্স ব্যবহার করার সিদ্ধান্ত নেন অথবা সেগুলোকে চালু রাখেন, তাহলে খরচ আরও বেশি হতে পারে (এই ডকুমেন্টের শেষে 'ক্লিনআপ' অংশটি দেখুন)। গুগল ক্লাউড স্প্যানারের মূল্য তালিকা এখানে নথিভুক্ত করা আছে।
গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি ফ্রি ট্রায়ালের জন্য যোগ্য, যার ফলে এই কোডল্যাবটি সম্পূর্ণ বিনামূল্যে পাওয়া যাবে।
গুগল ক্লাউড শেল সেটআপ
যদিও গুগল ক্লাউড এবং স্প্যানার আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।
এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এর মানে হলো, এই কোডল্যাবের জন্য আপনার শুধু একটি ব্রাউজার প্রয়োজন হবে (হ্যাঁ, এটি ক্রোমবুকেও কাজ করে)।
- ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন।
(পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।
ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার PROJECT_ID তে সেট করা আছে।
gcloud auth list
কমান্ড আউটপুট
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি কোনো কারণে প্রজেক্টটি সেট করা না থাকে, তাহলে নিম্নলিখিত কমান্ডটি দিন:
gcloud config set project <PROJECT_ID>
আপনার PROJECT_ID খুঁজছেন? সেটআপের ধাপগুলিতে আপনি কোন আইডি ব্যবহার করেছিলেন তা দেখে নিন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি খুঁজে দেখুন:
ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা ভবিষ্যতে কমান্ড চালানোর সময় কাজে লাগতে পারে।
echo $GOOGLE_CLOUD_PROJECT
কমান্ড আউটপুট
<PROJECT_ID>
- অবশেষে, ডিফল্ট জোন এবং প্রজেক্ট কনফিগারেশন সেট করুন।
gcloud config set compute/zone us-central1-f
আপনি বিভিন্ন ধরনের জোন বেছে নিতে পারেন। আরও তথ্যের জন্য, অঞ্চল ও জোন দেখুন।
সারসংক্ষেপ
এই ধাপে আপনি আপনার পরিবেশ সেটআপ করবেন।
এরপরে
এরপরে, আপনাকে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করতে হবে।
৩. একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করুন
এই ধাপে আমরা এই কোডল্যাবের জন্য আমাদের ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করব। স্প্যানার এন্ট্রিটি অনুসন্ধান করুন।
বাম উপরের হ্যামবার্গার মেনুতে
অথবা "/" চেপে "Spanner" টাইপ করে স্প্যানার অনুসন্ধান করুন।

এরপর, ক্লিক করুন
এবং আপনার ইনস্ট্যান্সের জন্য ইনস্ট্যান্সের নাম ‘cloudspanner-leaderboard’ লিখে, একটি কনফিগারেশন বেছে নিয়ে (একটি রিজিওনাল ইনস্ট্যান্স নির্বাচন করুন), এবং নোডের সংখ্যা নির্ধারণ করে ফর্মটি পূরণ করুন; এই কোডল্যাবের জন্য আমাদের কেবল ১টি নোড প্রয়োজন হবে। প্রোডাকশন ইনস্ট্যান্সের জন্য এবং ক্লাউড স্প্যানার SLA-এর যোগ্যতা অর্জনের জন্য আপনাকে আপনার ক্লাউড স্প্যানার ইনস্ট্যান্সে ৩ বা তার বেশি নোড চালাতে হবে।
সবশেষে, 'Create'-এ ক্লিক করুন এবং কয়েক সেকেন্ডের মধ্যেই আপনার ব্যবহারের জন্য একটি ক্লাউড স্প্যানার ইনস্ট্যান্স পেয়ে যাবেন।

পরবর্তী ধাপে আমরা আমাদের নতুন ইনস্ট্যান্সে একটি ডাটাবেস এবং স্কিমা তৈরি করার জন্য C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করব।
৪. একটি ডাটাবেস এবং স্কিমা তৈরি করুন
এই ধাপে আমরা আমাদের নমুনা ডাটাবেস এবং স্কিমা তৈরি করব।
চলুন, C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে দুটি টেবিল তৈরি করি; খেলোয়াড়ের তথ্যের জন্য একটি Players টেবিল এবং খেলোয়াড়ের স্কোর সংরক্ষণের জন্য একটি Scores টেবিল। এটি করার জন্য, আমরা ক্লাউড শেলে একটি C# কনসোল অ্যাপ্লিকেশন তৈরির ধাপগুলো অনুসরণ করব।
প্রথমে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি টাইপ করে গিটহাব থেকে এই কোডল্যাবের নমুনা কোডটি ক্লোন করুন:
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
এরপর 'applications' ডিরেক্টরিতে যান, যেখানে আপনি আপনার অ্যাপ্লিকেশনটি তৈরি করবেন।
cd dotnet-docs-samples/applications/
এই কোডল্যাবের জন্য প্রয়োজনীয় সমস্ত কোড বিদ্যমান dotnet-docs-samples/applications/leaderboard ডিরেক্টরিতে Leaderboard নামের একটি রানযোগ্য C# অ্যাপ্লিকেশন হিসেবে রয়েছে, যা কোডল্যাবটি করার সময় আপনার রেফারেন্স হিসেবে কাজ করবে। আমরা একটি নতুন ডিরেক্টরি তৈরি করব এবং পর্যায়ক্রমে Leaderboard অ্যাপ্লিকেশনটির একটি কপি বিল্ড করব।
অ্যাপ্লিকেশনটির জন্য 'codelab' নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করে সেটিতে প্রবেশ করুন:
mkdir codelab && cd $_
নিম্নলিখিত কমান্ড ব্যবহার করে 'Leaderboard' নামে একটি নতুন .NET C# কনসোল অ্যাপ্লিকেশন তৈরি করুন:
dotnet new console -n Leaderboard
এই কমান্ডটি দুটি প্রধান ফাইল, প্রজেক্ট ফাইল Leaderboard.csproj এবং প্রোগ্রাম ফাইল Program.cs নিয়ে একটি সাধারণ কনসোল অ্যাপ্লিকেশন তৈরি করে।
চলুন এটি চালানো যাক। নতুন তৈরি করা লিডারবোর্ড ডিরেক্টরিতে যান, যেখানে অ্যাপ্লিকেশনটি রয়েছে:
cd Leaderboard
তারপর এটি চালানোর জন্য নিম্নলিখিত কমান্ডটি প্রবেশ করান।
dotnet run
আপনি অ্যাপ্লিকেশনটির আউটপুটে "Hello World!" দেখতে পাবেন।
এখন চলুন Program.cs এডিট করে আমাদের কনসোল অ্যাপটি আপডেট করি। এর জন্য C# স্প্যানার ক্লায়েন্ট লাইব্রেরি ব্যবহার করে প্লেয়ার্স এবং স্কোর্স নামে দুটি টেবিল সম্বলিত একটি লিডারবোর্ড তৈরি করতে হবে। আপনি এই কাজটি সরাসরি ক্লাউড শেল এডিটরেই করতে পারেন:
নীচে হাইলাইট করা আইকনটিতে ক্লিক করে ক্লাউড শেল এডিটর খুলুন:

এরপর, ক্লাউড শেল এডিটরে Program.cs ফাইলটি খুলুন এবং leaderboard ডেটাবেস ও Players এবং Scores টেবিল তৈরি করার জন্য প্রয়োজনীয় কোড দিয়ে ফাইলটির বিদ্যমান কোড প্রতিস্থাপন করুন। এর জন্য, নিম্নলিখিত C# অ্যাপ্লিকেশন কোডটি Program.cs ফাইলে পেস্ট করুন:
using System;
using System.Threading.Tasks;
using Google.Cloud.Spanner.Data;
using CommandLine;
namespace GoogleCloudSamples.Leaderboard
{
[Verb("create", HelpText = "Create a sample Cloud Spanner database "
+ "along with sample 'Players' and 'Scores' tables in your project.")]
class CreateOptions
{
[Value(0, HelpText = "The project ID of the project to use "
+ "when creating Cloud Spanner resources.", Required = true)]
public string projectId { get; set; }
[Value(1, HelpText = "The ID of the instance where the sample database "
+ "will be created.", Required = true)]
public string instanceId { get; set; }
[Value(2, HelpText = "The ID of the sample database to create.",
Required = true)]
public string databaseId { get; set; }
}
public class Program
{
enum ExitCode : int
{
Success = 0,
InvalidParameter = 1,
}
public static object Create(string projectId,
string instanceId, string databaseId)
{
var response =
CreateAsync(projectId, instanceId, databaseId);
Console.WriteLine("Waiting for operation to complete...");
response.Wait();
Console.WriteLine($"Operation status: {response.Status}");
Console.WriteLine($"Created sample database {databaseId} on "
+ $"instance {instanceId}");
return ExitCode.Success;
}
public static async Task CreateAsync(
string projectId, string instanceId, string databaseId)
{
// Initialize request connection string for database creation.
string connectionString =
$"Data Source=projects/{projectId}/instances/{instanceId}";
using (var connection = new SpannerConnection(connectionString))
{
string createStatement = $"CREATE DATABASE `{databaseId}`";
string[] createTableStatements = new string[] {
// Define create table statement for Players table.
@"CREATE TABLE Players(
PlayerId INT64 NOT NULL,
PlayerName STRING(2048) NOT NULL
) PRIMARY KEY(PlayerId)",
// Define create table statement for Scores table.
@"CREATE TABLE Scores(
PlayerId INT64 NOT NULL,
Score INT64 NOT NULL,
Timestamp TIMESTAMP NOT NULL OPTIONS(allow_commit_timestamp=true)
) PRIMARY KEY(PlayerId, Timestamp),
INTERLEAVE IN PARENT Players ON DELETE NO ACTION" };
// Make the request.
var cmd = connection.CreateDdlCommand(
createStatement, createTableStatements);
try
{
await cmd.ExecuteNonQueryAsync();
}
catch (SpannerException e) when
(e.ErrorCode == ErrorCode.AlreadyExists)
{
// OK.
}
}
}
public static int Main(string[] args)
{
var verbMap = new VerbMap<object>();
verbMap
.Add((CreateOptions opts) => Create(
opts.projectId, opts.instanceId, opts.databaseId))
.NotParsedFunc = (err) => 1;
return (int)verbMap.Run(args);
}
}
}
প্রোগ্রাম কোড সম্পর্কে আরও স্পষ্ট ধারণা দেওয়ার জন্য, এখানে প্রোগ্রামটির একটি ডায়াগ্রাম দেওয়া হলো, যেখানে এর প্রধান উপাদানগুলো চিহ্নিত করা আছে:

create কমান্ডটি সক্রিয় করার জন্য কোড যোগ করার পর আপনার Program.cs ফাইলটি কেমন দেখতে হবে, তার একটি উদাহরণ দেখার জন্য আপনি dotnet-docs-samples/applications/leaderboard/step4 ডিরেক্টরিতে থাকা Program.cs ফাইলটি ব্যবহার করতে পারেন।
এরপর ক্লাউড শেল এডিটর ব্যবহার করে প্রোগ্রামটির প্রজেক্ট ফাইল Leaderboard.csproj খুলুন এবং নিচের কোডের মতো করে এটি আপডেট করুন। ক্লাউড শেল এডিটরের 'ফাইল' মেনু ব্যবহার করে আপনার সমস্ত পরিবর্তন সেভ করতে ভুলবেন না।
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Google.Cloud.Spanner.Data" Version="3.3.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\commandlineutil\Lib\CommandLineUtil.csproj" />
</ItemGroup>
</Project>
এই পরিবর্তনের মাধ্যমে C# স্প্যানার নুগেট প্যাকেজ Google.Cloud.Spanner.Data এর একটি রেফারেন্স যোগ করা হয়েছে, যা আমাদের ক্লাউড স্প্যানার এপিআই (Cloud Spanner API)-এর সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজন। এই পরিবর্তনটি CommandLineUtil প্রজেক্টেরও একটি রেফারেন্স যোগ করে, যা dotnet-doc-samples গিটহাব রিপোজিটরির একটি অংশ এবং ওপেন সোর্স CommandLineParser এর জন্য একটি দরকারি 'verbmap' এক্সটেনশন প্রদান করে; এটি কনসোল অ্যাপ্লিকেশনের জন্য কমান্ড লাইন ইনপুট হ্যান্ডেল করার একটি সুবিধাজনক লাইব্রেরি।
create কমান্ডটি সক্রিয় করার জন্য কোড যোগ করার পর আপনার Leaderboard.csproj ফাইলটি কেমন দেখতে হবে, তার একটি উদাহরণ দেখার জন্য আপনি dotnet-docs-samples/applications/leaderboard/step4 ডিরেক্টরিতে থাকা Leaderboard.csproj ফাইলটি ব্যবহার করতে পারেন।
এখন আপনি আপনার আপডেট করা নমুনাটি চালানোর জন্য প্রস্তুত। আপনার আপডেট করা অ্যাপ্লিকেশনটির ডিফল্ট প্রতিক্রিয়া দেখতে নিম্নলিখিতটি টাইপ করুন:
dotnet run
আপনি নিম্নলিখিতের মতো আউটপুট দেখতে পাবেন:
Leaderboard 1.0.0 Copyright (C) 2018 Leaderboard ERROR(S): No verb selected. create Create a sample Cloud Spanner database along with sample 'Players' and 'Scores' tables in your project. help Display more information on a specific command. version Display version information.
এই প্রতিক্রিয়া থেকে আমরা দেখতে পাচ্ছি যে এটি হলো Leaderboard অ্যাপ্লিকেশন, যা তিনটি সম্ভাব্য কমান্ডের যেকোনো একটি দিয়ে চালানো যেতে পারে: create , help , এবং version ।
চলুন, একটি স্প্যানার ডাটাবেস ও টেবিল তৈরি করতে ` create কমান্ডটি ব্যবহার করে দেখি। কমান্ডটির প্রত্যাশিত আর্গুমেন্টগুলো দেখতে, কোনো আর্গুমেন্ট ছাড়াই এটি চালান।
dotnet run create
আপনি নিম্নলিখিতের মতো একটি প্রতিক্রিয়া দেখতে পাবেন:
Leaderboard 1.0.0 Copyright (C) 2018 Leaderboard ERROR(S): A required value not bound to option name is missing. --help Display this help screen. --version Display version information. value pos. 0 Required. The project ID of the project to use when creating Cloud Spanner resources. value pos. 1 Required. The ID of the instance where the sample database will be created. value pos. 2 Required. The ID of the sample database to create.
এখানে আমরা দেখতে পাচ্ছি যে, ` create কমান্ডের প্রত্যাশিত আর্গুমেন্টগুলো হলো `Project ID`, `Instance ID`, এবং `Database ID`।
এখন নিচের কমান্ডটি চালান। খেয়াল রাখবেন, PROJECT_ID জায়গায় যেন এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডিটি বসে।
dotnet run create PROJECT_ID cloudspanner-leaderboard leaderboard
কয়েক সেকেন্ড পরে আপনি নিম্নলিখিতের মতো একটি প্রতিক্রিয়া দেখতে পাবেন:
Waiting for operation to complete... Operation status: RanToCompletion Created sample database leaderboard on instance cloudspanner-leaderboard
ক্লাউড কনসোলের ক্লাউড স্প্যানার বিভাগে বাম দিকের মেনুতে আপনার নতুন ডেটাবেস এবং টেবিলগুলো দেখতে পাবেন।

পরবর্তী ধাপে আমরা আপনার নতুন ডেটাবেসে কিছু ডেটা লোড করার জন্য আমাদের অ্যাপ্লিকেশনটি আপডেট করব।
৫. ডেটা লোড করুন
আমাদের কাছে এখন leaderboard নামে একটি ডাটাবেস আছে, যাতে Players এবং Scores নামে দুটি টেবিল রয়েছে। এখন চলুন C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আমাদের Players টেবিলে খেলোয়াড়দের তথ্য এবং Scores টেবিলে প্রতিটি খেলোয়াড়ের জন্য র্যান্ডম স্কোর যুক্ত করি।
নীচে হাইলাইট করা আইকনটিতে ক্লিক করে ক্লাউড শেল এডিটর খুলুন:

এরপর, ক্লাউড শেল এডিটরে Program.cs ফাইলটি সম্পাদনা করে একটি insert কমান্ড যোগ করুন, যা ব্যবহার করে Players টেবিলে ১০০ জন খেলোয়াড় যুক্ত করা যাবে অথবা Players টেবিলের প্রত্যেক খেলোয়াড়ের জন্য Scores টেবিলে এলোমেলোভাবে ৪টি স্কোর যুক্ত করা যাবে।
প্রথমে প্রোগ্রামের শীর্ষে 'Verbmap'-এ বিদ্যমান create কমান্ড ব্লকের নিচে একটি নতুন insert কমান্ড ব্লক যোগ করুন:
[Verb("insert", HelpText = "Insert sample 'players' records or 'scores' records "
+ "into the database.")]
class InsertOptions
{
[Value(0, HelpText = "The project ID of the project to use "
+ "when managing Cloud Spanner resources.", Required = true)]
public string projectId { get; set; }
[Value(1, HelpText = "The ID of the instance where the sample database resides.",
Required = true)]
public string instanceId { get; set; }
[Value(2, HelpText = "The ID of the database where the sample database resides.",
Required = true)]
public string databaseId { get; set; }
[Value(3, HelpText = "The type of insert to perform, 'players' or 'scores'.",
Required = true)]
public string insertType { get; set; }
}
এরপরে বিদ্যমান CreateAsync মেথডের নিচে Insert , InsertPlayersAsync , এবং InsertScoresAsync মেথডগুলো যোগ করুন:
public static object Insert(string projectId,
string instanceId, string databaseId, string insertType)
{
if (insertType.ToLower() == "players")
{
var responseTask =
InsertPlayersAsync(projectId, instanceId, databaseId);
Console.WriteLine("Waiting for insert players operation to complete...");
responseTask.Wait();
Console.WriteLine($"Operation status: {responseTask.Status}");
}
else if (insertType.ToLower() == "scores")
{
var responseTask =
InsertScoresAsync(projectId, instanceId, databaseId);
Console.WriteLine("Waiting for insert scores operation to complete...");
responseTask.Wait();
Console.WriteLine($"Operation status: {responseTask.Status}");
}
else
{
Console.WriteLine("Invalid value for 'type of insert'. "
+ "Specify 'players' or 'scores'.");
return ExitCode.InvalidParameter;
}
Console.WriteLine($"Inserted {insertType} into sample database "
+ $"{databaseId} on instance {instanceId}");
return ExitCode.Success;
}
public static async Task InsertPlayersAsync(string projectId,
string instanceId, string databaseId)
{
string connectionString =
$"Data Source=projects/{projectId}/instances/{instanceId}"
+ $"/databases/{databaseId}";
long numberOfPlayers = 0;
using (var connection = new SpannerConnection(connectionString))
{
await connection.OpenAsync();
await connection.RunWithRetriableTransactionAsync(async (transaction) =>
{
// Execute a SQL statement to get current number of records
// in the Players table to use as an incrementing value
// for each PlayerName to be inserted.
var cmd = connection.CreateSelectCommand(
@"SELECT Count(PlayerId) as PlayerCount FROM Players");
numberOfPlayers = await cmd.ExecuteScalarAsync<long>();
// Insert 100 player records into the Players table.
SpannerBatchCommand cmdBatch = connection.CreateBatchDmlCommand();
for (int i = 0; i < 100; i++)
{
numberOfPlayers++;
SpannerCommand cmdInsert = connection.CreateDmlCommand(
"INSERT INTO Players "
+ "(PlayerId, PlayerName) "
+ "VALUES (@PlayerId, @PlayerName)",
new SpannerParameterCollection {
{"PlayerId", SpannerDbType.Int64},
{"PlayerName", SpannerDbType.String}});
cmdInsert.Parameters["PlayerId"].Value =
Math.Abs(Guid.NewGuid().GetHashCode());
cmdInsert.Parameters["PlayerName"].Value =
$"Player {numberOfPlayers}";
cmdBatch.Add(cmdInsert);
}
await cmdBatch.ExecuteNonQueryAsync();
});
}
Console.WriteLine("Done inserting player records...");
}
public static async Task InsertScoresAsync(
string projectId, string instanceId, string databaseId)
{
string connectionString =
$"Data Source=projects/{projectId}/instances/{instanceId}"
+ $"/databases/{databaseId}";
// Insert 4 score records into the Scores table for each player
// in the Players table.
using (var connection = new SpannerConnection(connectionString))
{
await connection.OpenAsync();
await connection.RunWithRetriableTransactionAsync(async (transaction) =>
{
Random r = new Random();
bool playerRecordsFound = false;
SpannerBatchCommand cmdBatch =
connection.CreateBatchDmlCommand();
var cmdLookup =
connection.CreateSelectCommand("SELECT * FROM Players");
using (var reader = await cmdLookup.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
playerRecordsFound = true;
for (int i = 0; i < 4; i++)
{
DateTime randomTimestamp = DateTime.Now
.AddYears(r.Next(-2, 1))
.AddMonths(r.Next(-12, 1))
.AddDays(r.Next(-28, 0))
.AddHours(r.Next(-24, 0))
.AddSeconds(r.Next(-60, 0))
.AddMilliseconds(r.Next(-100000, 0));
SpannerCommand cmdInsert =
connection.CreateDmlCommand(
"INSERT INTO Scores "
+ "(PlayerId, Score, Timestamp) "
+ "VALUES (@PlayerId, @Score, @Timestamp)",
new SpannerParameterCollection {
{"PlayerId", SpannerDbType.Int64},
{"Score", SpannerDbType.Int64},
{"Timestamp",
SpannerDbType.Timestamp}});
cmdInsert.Parameters["PlayerId"].Value =
reader.GetFieldValue<int>("PlayerId");
cmdInsert.Parameters["Score"].Value =
r.Next(1000, 1000001);
cmdInsert.Parameters["Timestamp"].Value =
randomTimestamp.ToString("o");
cmdBatch.Add(cmdInsert);
}
}
if (!playerRecordsFound)
{
Console.WriteLine("Parameter 'scores' is invalid "
+ "since no player records currently exist. First "
+ "insert players then insert scores.");
Environment.Exit((int)ExitCode.InvalidParameter);
}
else
{
await cmdBatch.ExecuteNonQueryAsync();
Console.WriteLine(
"Done inserting score records..."
);
}
}
});
}
}
এরপর, insert কমান্ডটি কার্যকর করতে, আপনার প্রোগ্রামের "Main" মেথডে নিম্নলিখিত কোডটি যোগ করুন:
.Add((InsertOptions opts) => Insert(
opts.projectId, opts.instanceId, opts.databaseId, opts.insertType))
insert কমান্ডটি সক্রিয় করার জন্য কোড যোগ করার পর আপনার Program.cs ফাইলটি কেমন দেখতে হবে, তার একটি উদাহরণ দেখার জন্য আপনি dotnet-docs-samples/applications/leaderboard/step5 ডিরেক্টরিতে থাকা Program.cs ফাইলটি ব্যবহার করতে পারেন।
এখন প্রোগ্রামটি চালিয়ে নিশ্চিত হওয়া যাক যে নতুন insert কমান্ডটি প্রোগ্রামের সম্ভাব্য কমান্ডের তালিকায় অন্তর্ভুক্ত হয়েছে। নিম্নলিখিত কমান্ডটি চালান:
dotnet run
এখন আপনি প্রোগ্রামটির ডিফল্ট আউটপুটে insert কমান্ডটি অন্তর্ভুক্ত দেখতে পাবেন:
Leaderboard 1.0.0 Copyright (C) 2018 Leaderboard ERROR(S): No verb selected. create Create a sample Cloud Spanner database along with sample 'Players' and 'Scores' tables in your project. insert Insert sample 'players' records or 'scores' records into the database. help Display more information on a specific command. version Display version information.
এখন এর ইনপুট আর্গুমেন্টগুলো দেখতে insert কমান্ডটি চালানো যাক। নিচের কমান্ডটি প্রবেশ করান।
dotnet run insert
এর ফলে নিম্নলিখিত প্রতিক্রিয়াটি পাওয়া যাবে:
Leaderboard 1.0.0 Copyright (C) 2018 Leaderboard ERROR(S): A required value not bound to option name is missing. --help Display this help screen. --version Display version information. value pos. 0 Required. The project ID of the project to use when managing Cloud Spanner resources. value pos. 1 Required. The ID of the instance where the sample database resides. value pos. 2 Required. The ID of the database where the sample database resides. value pos. 3 Required. The type of insert to perform, 'players' or 'scores'.
প্রতিক্রিয়া থেকে দেখা যায় যে, প্রজেক্ট আইডি, ইনস্ট্যান্স আইডি এবং ডেটাবেস আইডি ছাড়াও আরও একটি আর্গুমেন্ট value pos. 3 যা হলো কোন ধরনের "ইনসার্ট" করা হবে। এই আর্গুমেন্টের মান 'players' বা 'scores' হতে পারে।
এখন, আমরা create কমান্ড কল করার সময় যে আর্গুমেন্ট ভ্যালুগুলো ব্যবহার করেছিলাম, সেগুলো দিয়েই insert কমান্ডটি রান করি এবং অতিরিক্ত "type of insert" আর্গুমেন্ট হিসেবে "players" যোগ করি। খেয়াল রাখবেন যেন PROJECT_ID জায়গায় এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডিটি বসে।
dotnet run insert PROJECT_ID cloudspanner-leaderboard leaderboard players
কয়েক সেকেন্ড পরে আপনি নিম্নলিখিতের মতো একটি প্রতিক্রিয়া দেখতে পাবেন:
Waiting for insert players operation to complete... Done inserting player records... Operation status: RanToCompletion Inserted players into sample database leaderboard on instance cloudspanner-leaderboard
এখন চলুন C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আমাদের Scores টেবিলটি চারটি র্যান্ডম স্কোর এবং Players টেবিলের প্রতিটি খেলোয়াড়ের টাইমস্ট্যাম্প দিয়ে পূরণ করি।
পূর্বে create কমান্ডটি চালানোর সময় কার্যকর করা নিম্নলিখিত SQL স্টেটমেন্টটির মাধ্যমে Scores টেবিলের Timestamp কলামটিকে একটি "commit timestamp" কলাম হিসেবে সংজ্ঞায়িত করা হয়েছিল:
CREATE TABLE Scores(
PlayerId INT64 NOT NULL,
Score INT64 NOT NULL,
Timestamp TIMESTAMP NOT NULL OPTIONS(allow_commit_timestamp=true)
) PRIMARY KEY(PlayerId, Timestamp),
INTERLEAVE IN PARENT Players ON DELETE NO ACTION
OPTIONS(allow_commit_timestamp=true) অ্যাট্রিবিউটটি লক্ষ্য করুন। এটি Timestamp একটি "কমিট টাইমস্ট্যাম্প" কলামে পরিণত করে এবং একটি নির্দিষ্ট টেবিল সারিতে INSERT ও UPDATE অপারেশনের জন্য এটিকে সঠিক ট্রানজ্যাকশন টাইমস্ট্যাম্প দিয়ে স্বয়ংক্রিয়ভাবে পূরণ করতে সক্ষম করে।
আপনি 'কমিট টাইমস্ট্যাম্প' কলামে আপনার নিজের টাইমস্ট্যাম্প মানও যোগ করতে পারেন, তবে শর্ত হলো আপনাকে অতীতের কোনো টাইমস্ট্যাম্প যোগ করতে হবে, এবং এই কোডল্যাবের উদ্দেশ্যে আমরা ঠিক তাই করব।
এখন, create কমান্ড কল করার সময় আমরা যে আর্গুমেন্ট ভ্যালুগুলো ব্যবহার করেছিলাম, সেই একই ভ্যালু দিয়ে insert কমান্ডটি রান করি এবং অতিরিক্ত "type of insert" আর্গুমেন্ট হিসেবে "scores" যোগ করি। খেয়াল রাখবেন যেন PROJECT_ID জায়গায় এই কোডল্যাবের শুরুতে আপনার তৈরি করা প্রজেক্ট আইডিটি বসে।
dotnet run insert PROJECT_ID cloudspanner-leaderboard leaderboard scores
কয়েক সেকেন্ড পরে আপনি নিম্নলিখিতের মতো একটি প্রতিক্রিয়া দেখতে পাবেন:
Waiting for insert players operation to complete... Done inserting player records... Operation status: RanToCompletion Inserted players into sample database leaderboard on instance cloudspanner-leaderboard
'টাইপ অফ ইনসার্ট' হিসেবে scores ' নির্দিষ্ট করে insert রান করলে InsertScoresAsync মেথডটি কল হয়, যা অতীতের কোনো তারিখ-সময়সহ এলোমেলোভাবে তৈরি একটি টাইমস্ট্যাম্প ইনসার্ট করার জন্য নিম্নলিখিত কোড স্নিপেটগুলো ব্যবহার করে:
DateTime randomTimestamp = DateTime.Now
.AddYears(r.Next(-2, 1))
.AddMonths(r.Next(-12, 1))
.AddDays(r.Next(-28, 0))
.AddHours(r.Next(-24, 0))
.AddSeconds(r.Next(-60, 0))
.AddMilliseconds(r.Next(-100000, 0));
...
cmdInsert.Parameters["Timestamp"].Value = randomTimestamp.ToString("o");
'Insert' ট্রানজ্যাকশনটি ঠিক কখন সংঘটিত হয়, সেই মুহূর্তের টাইমস্ট্যাম্প দিয়ে Timestamp কলামটি স্বয়ংক্রিয়ভাবে পূরণ করতে, আপনি এর পরিবর্তে নিম্নলিখিত কোড স্নিপেটের মতো করে C# কনস্ট্যান্ট SpannerParameter.CommitTimestamp ইনসার্ট করতে পারেন:
cmd.Parameters["Timestamp"].Value = SpannerParameter.CommitTimestamp;
এখন যেহেতু আমরা ডেটা লোড করা সম্পন্ন করেছি, চলুন আমাদের নতুন টেবিলগুলোতে লেখা মানগুলো যাচাই করে নিই। প্রথমে leaderboard ডাটাবেসটি নির্বাচন করুন এবং তারপর Players টেবিলটি নির্বাচন করুন। ডেটা Data ট্যাবে ক্লিক করুন। আপনি দেখতে পাবেন যে টেবিলের PlayerId এবং PlayerName কলামগুলোতে ডেটা রয়েছে।

এরপর, Scores টেবিলে ক্লিক করে Data ট্যাবটি নির্বাচন করে যাচাই করে নেওয়া যাক যে টেবিলটিতেও ডেটা আছে কিনা। আপনি দেখতে পাবেন যে টেবিলটির PlayerId , Timestamp এবং Score কলামগুলিতে ডেটা রয়েছে।

খুব ভালো! চলো আমাদের প্রোগ্রামটি আপডেট করি, যাতে এটি এমন কিছু কোয়েরি চালাতে পারে যা ব্যবহার করে আমরা একটি গেমিং লিডারবোর্ড তৈরি করতে পারব।
৬. লিডারবোর্ড কোয়েরি চালান
এখন যেহেতু আমরা আমাদের ডাটাবেস তৈরি করে টেবিলগুলোতে তথ্য লোড করে ফেলেছি, চলুন এই ডেটা ব্যবহার করে একটি লিডারবোর্ড তৈরি করি। এটি করার জন্য আমাদের নিম্নলিখিত চারটি প্রশ্নের উত্তর দিতে হবে:
- সর্বকালের সেরা দশজন খেলোয়াড় কারা?
- এ বছরের 'সেরা দশ' খেলোয়াড় কারা?
- এই মাসের 'সেরা দশ' খেলোয়াড় কারা?
- এই সপ্তাহের 'সেরা দশ' খেলোয়াড় কারা?
চলুন, এই প্রশ্নগুলোর উত্তর দেবে এমন SQL কোয়েরিগুলো চালানোর জন্য আমাদের প্রোগ্রামটি আপডেট করি।
আমরা একটি query কমান্ড যুক্ত করব, যার মাধ্যমে আমাদের লিডারবোর্ডের জন্য প্রয়োজনীয় তথ্য সংগ্রহ করতে প্রশ্নগুলোর উত্তর খোঁজার জন্য কোয়েরিগুলো চালানো যাবে।
একটি query কমান্ড যোগ করে প্রোগ্রামটি আপডেট করার জন্য ক্লাউড শেল এডিটরে Program.cs ফাইলটি সম্পাদনা করুন।
প্রথমে প্রোগ্রামের শীর্ষে 'Verbmap'-এ বিদ্যমান insert কমান্ড ব্লকের নিচে একটি নতুন query কমান্ড ব্লক যোগ করুন:
[Verb("query", HelpText = "Query players with 'Top Ten' scores within a specific timespan "
+ "from sample Cloud Spanner database table.")]
class QueryOptions
{
[Value(0, HelpText = "The project ID of the project to use "
+ "when managing Cloud Spanner resources.", Required = true)]
public string projectId { get; set; }
[Value(1, HelpText = "The ID of the instance where the sample data resides.",
Required = true)]
public string instanceId { get; set; }
[Value(2, HelpText = "The ID of the database where the sample data resides.",
Required = true)]
public string databaseId { get; set; }
[Value(3, Default = 0, HelpText = "The timespan in hours that will be used to filter the "
+ "results based on a record's timestamp. The default will return the "
+ "'Top Ten' scores of all time.")]
public int timespan { get; set; }
}
এরপরে বিদ্যমান InsertScoresAsync মেথডটির নিচে নিম্নলিখিত Query এবং QueryAsync মেথডগুলো যোগ করুন:
public static object Query(string projectId,
string instanceId, string databaseId, int timespan)
{
var response = QueryAsync(
projectId, instanceId, databaseId, timespan);
response.Wait();
return ExitCode.Success;
}
public static async Task QueryAsync(
string projectId, string instanceId, string databaseId, int timespan)
{
string connectionString =
$"Data Source=projects/{projectId}/instances/"
+ $"{instanceId}/databases/{databaseId}";
// Create connection to Cloud Spanner.
using (var connection = new SpannerConnection(connectionString))
{
string sqlCommand;
if (timespan == 0)
{
// No timespan specified. Query Top Ten scores of all time.
sqlCommand =
@"SELECT p.PlayerId, p.PlayerName, s.Score, s.Timestamp
FROM Players p
JOIN Scores s ON p.PlayerId = s.PlayerId
ORDER BY s.Score DESC LIMIT 10";
}
else
{
// Query Top Ten scores filtered by the timepan specified.
sqlCommand =
$@"SELECT p.PlayerId, p.PlayerName, s.Score, s.Timestamp
FROM Players p
JOIN Scores s ON p.PlayerId = s.PlayerId
WHERE s.Timestamp >
TIMESTAMP_SUB(CURRENT_TIMESTAMP(),
INTERVAL {timespan.ToString()} HOUR)
ORDER BY s.Score DESC LIMIT 10";
}
var cmd = connection.CreateSelectCommand(sqlCommand);
using (var reader = await cmd.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
Console.WriteLine("PlayerId : "
+ reader.GetFieldValue<string>("PlayerId")
+ " PlayerName : "
+ reader.GetFieldValue<string>("PlayerName")
+ " Score : "
+ string.Format("{0:n0}",
Int64.Parse(reader.GetFieldValue<string>("Score")))
+ " Timestamp : "
+ reader.GetFieldValue<string>("Timestamp").Substring(0, 10));
}
}
}
}
এরপর, query কমান্ডটি কার্যকর করতে, আপনার প্রোগ্রামের "Main" মেথডে নিম্নলিখিত কোডটি যোগ করুন:
.Add((QueryOptions opts) => Query(
opts.projectId, opts.instanceId, opts.databaseId, opts.timespan))
query কমান্ডটি সক্রিয় করার জন্য কোড যোগ করার পর আপনার Program.cs ফাইলটি কেমন দেখতে হবে, তার একটি উদাহরণ দেখার জন্য আপনি dotnet-docs-samples/applications/leaderboard/step6 ডিরেক্টরিতে থাকা Program.cs ফাইলটি ব্যবহার করতে পারেন।
এখন প্রোগ্রামটি চালিয়ে নিশ্চিত হওয়া যাক যে নতুন query কমান্ডটি প্রোগ্রামের সম্ভাব্য কমান্ডের তালিকায় অন্তর্ভুক্ত হয়েছে। নিম্নলিখিত কমান্ডটি চালান:
dotnet run
আপনি এখন প্রোগ্রামটির ডিফল্ট আউটপুটে query কমান্ডটি একটি নতুন কমান্ড অপশন হিসেবে অন্তর্ভুক্ত দেখতে পাবেন:
Leaderboard 1.0.0 Copyright (C) 2018 Leaderboard ERROR(S): No verb selected. create Create a sample Cloud Spanner database along with sample 'Players' and 'Scores' tables in your project. insert Insert sample 'players' records or 'scores' records into the database. query Query players with 'Top Ten' scores within a specific timespan from sample Cloud Spanner database table. help Display more information on a specific command. version Display version information.
এখন এর ইনপুট আর্গুমেন্টগুলো দেখতে query কমান্ডটি চালানো যাক। নিম্নলিখিত কমান্ডটি প্রবেশ করান:
dotnet run query
এর ফলে নিম্নলিখিত প্রতিক্রিয়াটি পাওয়া যাবে:
Leaderboard 1.0.0 Copyright (C) 2018 Leaderboard ERROR(S): A required value not bound to option name is missing. --help Display this help screen. --version Display version information. value pos. 0 Required. The project ID of the project to use when managing Cloud Spanner resources. value pos. 1 Required. The ID of the instance where the sample data resides. value pos. 2 Required. The ID of the database where the sample data resides. value pos. 3 (Default: 0) The timespan in hours that will be used to filter the results based on a record's timestamp. The default will return the 'Top Ten' scores of all time.
You can see from the response that in addition to the Project ID, Instance ID, and Database ID there's another argument value pos. 3 expected which allows us to specify a timespan in number of hours to use for filtering records based on their value in the Scores table's Timestamp column. This argument has a default value of 0 which means no records will be filtered by timestamps. So we can use the query command without a "timespan" value to get a list of our "Top Ten" players of all time.
চলুন, 'timespan' উল্লেখ না করে query কমান্ডটি চালাই, এবং এর জন্য আমরা create কমান্ড চালানোর সময় ব্যবহৃত আর্গুমেন্ট ভ্যালুগুলোই ব্যবহার করব। খেয়াল রাখবেন, PROJECT_ID জায়গায় এই কোডল্যাবের শুরুতে আপনার তৈরি করা প্রজেক্ট আইডিটি বসাবেন।
dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard
আপনি নিম্নলিখিতের মতো সর্বকালের 'সেরা দশ' খেলোয়াড়ের নামসহ একটি উত্তর দেখতে পাবেন:
PlayerId : 1843159180 PlayerName : Player 87 Score : 998,955 Timestamp : 2016-03-23
PlayerId : 61891198 PlayerName : Player 19 Score : 998,720 Timestamp : 2016-03-26
PlayerId : 340906298 PlayerName : Player 48 Score : 993,302 Timestamp : 2015-08-27
PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 857460496 PlayerName : Player 68 Score : 988,010 Timestamp : 2015-05-25
PlayerId : 1826646419 PlayerName : Player 91 Score : 984,022 Timestamp : 2016-11-26
PlayerId : 1002199735 PlayerName : Player 35 Score : 982,933 Timestamp : 2015-09-26
PlayerId : 2002563755 PlayerName : Player 23 Score : 979,041 Timestamp : 2016-10-25
PlayerId : 1377548191 PlayerName : Player 2 Score : 978,632 Timestamp : 2016-05-02
PlayerId : 1358098565 PlayerName : Player 65 Score : 973,257 Timestamp : 2016-10-30
এখন, বছরের "সেরা দশ" খেলোয়াড়দের খুঁজে বের করার জন্য প্রয়োজনীয় আর্গুমেন্ট সহ ` query কমান্ডটি চালান। এর জন্য `timespan` হিসেবে বছরের মোট ঘন্টার সংখ্যা, অর্থাৎ ৮৭৬০, উল্লেখ করুন। নিশ্চিত করুন যে আপনি PROJECT_ID এর জায়গায় এই কোডল্যাবের শুরুতে তৈরি করা আপনার প্রজেক্ট আইডিটি বসিয়েছেন।
dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard 8760
আপনি নিম্নলিখিতের মতো বছরের 'সেরা দশ' খেলোয়াড়ের নামসহ একটি উত্তর দেখতে পাবেন:
PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 228469898 PlayerName : Player 82 Score : 967,177 Timestamp : 2018-01-26
PlayerId : 1131343000 PlayerName : Player 26 Score : 944,725 Timestamp : 2017-05-26
PlayerId : 396780730 PlayerName : Player 41 Score : 929,455 Timestamp : 2017-09-26
PlayerId : 61891198 PlayerName : Player 19 Score : 921,251 Timestamp : 2018-05-01
PlayerId : 634269851 PlayerName : Player 54 Score : 909,379 Timestamp : 2017-07-24
PlayerId : 821111159 PlayerName : Player 55 Score : 908,402 Timestamp : 2017-05-25
PlayerId : 228469898 PlayerName : Player 82 Score : 889,040 Timestamp : 2017-12-26
PlayerId : 1408782275 PlayerName : Player 27 Score : 874,124 Timestamp : 2017-09-24
PlayerId : 1002199735 PlayerName : Player 35 Score : 864,758 Timestamp : 2018-04-24
এখন, মাসের সেরা দশজন খেলোয়াড়কে খুঁজে বের করার জন্য ` query কমান্ডটি চালান। এর জন্য `timespan` হিসেবে মাসের মোট ঘন্টার সংখ্যা, অর্থাৎ ৭৩০, উল্লেখ করুন। খেয়াল রাখবেন, PROJECT_ID জায়গায় যেন এই কোডল্যাবের শুরুতে তৈরি করা আপনার প্রজেক্ট আইডিটি বসে।
dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard 730
আপনি নিচের মতো একটি উত্তর দেখতে পাবেন, যেখানে মাসের 'সেরা দশ' খেলোয়াড়ের নাম অন্তর্ভুক্ত থাকবে:
PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 61891198 PlayerName : Player 19 Score : 921,251 Timestamp : 2018-05-01
PlayerId : 1002199735 PlayerName : Player 35 Score : 864,758 Timestamp : 2018-04-24
PlayerId : 1228490432 PlayerName : Player 11 Score : 682,033 Timestamp : 2018-04-26
PlayerId : 648239230 PlayerName : Player 92 Score : 653,895 Timestamp : 2018-05-02
PlayerId : 70762849 PlayerName : Player 77 Score : 598,074 Timestamp : 2018-04-22
PlayerId : 1671215342 PlayerName : Player 62 Score : 506,770 Timestamp : 2018-04-28
PlayerId : 1208850523 PlayerName : Player 21 Score : 216,008 Timestamp : 2018-04-30
PlayerId : 1587692674 PlayerName : Player 63 Score : 188,157 Timestamp : 2018-04-25
PlayerId : 992391797 PlayerName : Player 37 Score : 167,175 Timestamp : 2018-04-30
এখন, সপ্তাহের 'সেরা দশ' খেলোয়াড়দের খুঁজে বের করার জন্য ` query কমান্ডটি চালান। এর জন্য `timespan` হিসেবে সপ্তাহের মোট ঘন্টার সংখ্যা, অর্থাৎ ১৬৮, উল্লেখ করুন। খেয়াল রাখবেন, PROJECT_ID জায়গায় যেন এই কোডল্যাবের শুরুতে তৈরি করা আপনার প্রজেক্ট আইডিটি বসে।
dotnet run query PROJECT_ID cloudspanner-leaderboard leaderboard 168
আপনি নিচের মতো একটি উত্তর দেখতে পাবেন, যেখানে সপ্তাহের 'সেরা দশ' খেলোয়াড়ের নাম অন্তর্ভুক্ত থাকবে:
PlayerId : 541473117 PlayerName : Player 22 Score : 991,368 Timestamp : 2018-04-30
PlayerId : 61891198 PlayerName : Player 19 Score : 921,251 Timestamp : 2018-05-01
PlayerId : 228469898 PlayerName : Player 82 Score : 853,602 Timestamp : 2018-04-28
PlayerId : 1131343000 PlayerName : Player 26 Score : 695,318 Timestamp : 2018-04-30
PlayerId : 1228490432 PlayerName : Player 11 Score : 682,033 Timestamp : 2018-04-26
PlayerId : 1408782275 PlayerName : Player 27 Score : 671,827 Timestamp : 2018-04-27
PlayerId : 648239230 PlayerName : Player 92 Score : 653,895 Timestamp : 2018-05-02
PlayerId : 816861444 PlayerName : Player 83 Score : 622,277 Timestamp : 2018-04-27
PlayerId : 162043954 PlayerName : Player 75 Score : 572,634 Timestamp : 2018-05-02
PlayerId : 1671215342 PlayerName : Player 62 Score : 506,770 Timestamp : 2018-04-28
চমৎকার কাজ!
এখন আপনি রেকর্ড যোগ করার সাথে সাথে স্প্যানার আপনার ডাটাবেসকে আপনার প্রয়োজন অনুযায়ী বড় করে তুলবে।
আপনার ডেটাবেস যতই বড় হোক না কেন, স্প্যানার এবং এর ট্রুটাইম প্রযুক্তির সাহায্যে আপনার গেমের লিডারবোর্ড নির্ভুলভাবে বাড়তে থাকবে।
৭. পরিচ্ছন্নতা
স্প্যানার নিয়ে এত মজা করার পর, আমাদের প্লেগ্রাউন্ডটি পরিষ্কার করা দরকার, যা মূল্যবান রিসোর্স এবং অর্থ বাঁচাবে। সৌভাগ্যবশত, এটি একটি সহজ পদক্ষেপ; শুধু ডেভেলপার কনসোলে যান এবং কোডল্যাবের "সেটআপ এ ক্লাউড স্প্যানার ইনস্ট্যান্স" নামের ধাপে তৈরি করা ইনস্ট্যান্সটি ডিলিট করে দিন।
৮. অভিনন্দন!
আমরা যা আলোচনা করেছি:
- লিডারবোর্ডের জন্য গুগল ক্লাউড স্প্যানার ইনস্ট্যান্স, ডেটাবেস এবং টেবিল স্কিমা
- কিভাবে .NET Core C# কনসোল অ্যাপ্লিকেশন তৈরি করবেন
- C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে স্প্যানার ডাটাবেস এবং টেবিল তৈরি করবেন
- C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে স্প্যানার ডেটাবেসে কীভাবে ডেটা লোড করবেন
- স্প্যানার কমিট টাইমস্ট্যাম্প এবং সি# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে আপনার ডেটা থেকে কীভাবে 'শীর্ষ দশ' ফলাফল কোয়েরি করবেন
পরবর্তী পদক্ষেপ:
- স্প্যানার ক্যাপ হোয়াইটপেপারটি পড়ুন
- স্কিমা ডিজাইন এবং কোয়েরির সেরা অনুশীলন সম্পর্কে জানুন।
- ক্লাউড স্প্যানার কমিট টাইমস্ট্যাম্প সম্পর্কে আরও জানুন
আপনার মতামত দিন
- অনুগ্রহ করে একটু সময় নিয়ে আমাদের এই সংক্ষিপ্ত সমীক্ষাটি পূরণ করুন।