ক্লাউড স্প্যানার: C# দিয়ে একটি গেমিং লিডারবোর্ড তৈরি করুন

1. ওভারভিউ

Google ক্লাউড স্প্যানার হল একটি সম্পূর্ণরূপে পরিচালিত অনুভূমিকভাবে স্কেলযোগ্য, বিশ্বব্যাপী বিতরণ করা, রিলেশনাল ডাটাবেস পরিষেবা যা কর্মক্ষমতা এবং উচ্চ প্রাপ্যতা ছেড়ে না দিয়ে ACID লেনদেন এবং SQL শব্দার্থবিদ্যা প্রদান করে৷

এই ল্যাবে, আপনি শিখবেন কিভাবে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করতে হয়। আপনি একটি ডাটাবেস এবং স্কিমা তৈরির ধাপগুলি অতিক্রম করবেন যা একটি গেমিং লিডারবোর্ডের জন্য ব্যবহার করা যেতে পারে। আপনি প্লেয়ারের তথ্য সঞ্চয় করার জন্য একটি প্লেয়ার টেবিল এবং প্লেয়ারের স্কোর সঞ্চয় করার জন্য একটি স্কোর টেবিল তৈরি করে শুরু করবেন।

এরপরে আপনি নমুনা ডেটা সহ টেবিলগুলি পূরণ করবেন। তারপরে আপনি কিছু শীর্ষ দশটি নমুনা প্রশ্নগুলি চালিয়ে এবং শেষ পর্যন্ত সংস্থানগুলি খালি করার জন্য উদাহরণটি মুছে ফেলার মাধ্যমে ল্যাবটি শেষ করবেন।

আপনি কি শিখবেন

  • একটি ক্লাউড স্প্যানার উদাহরণ কিভাবে সেটআপ করবেন।
  • কিভাবে একটি ডাটাবেস এবং টেবিল তৈরি করতে হয়।
  • একটি কমিট টাইমস্ট্যাম্প কলাম কিভাবে ব্যবহার করবেন।
  • টাইমস্ট্যাম্প সহ আপনার ক্লাউড স্প্যানার ডাটাবেস টেবিলে কীভাবে ডেটা লোড করবেন।
  • আপনার ক্লাউড স্প্যানার ডাটাবেসকে কীভাবে জিজ্ঞাসা করবেন।
  • কিভাবে আপনার ক্লাউড স্প্যানার ইনস্ট্যান্স মুছে ফেলবেন।

আপনি কি প্রয়োজন হবে

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

আপনি Google ক্লাউড প্ল্যাটফর্মের সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

2. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিসম্পন্ন পরিবেশ সেটআপ

আপনার যদি ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে (Gmail বা Google Apps), তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে। Google ক্লাউড প্ল্যাটফর্ম কনসোলে সাইন-ইন করুন ( console.cloud.google.com ) এবং একটি নতুন প্রকল্প তৈরি করুন৷

আপনার যদি ইতিমধ্যে একটি প্রকল্প থাকে, তাহলে কনসোলের উপরের বাম দিকে প্রজেক্ট নির্বাচন পুল ডাউন মেনুতে ক্লিক করুন:

6c9406d9b014760.png

এবং একটি নতুন প্রকল্প তৈরি করতে ফলাফল ডায়ালগে 'নতুন প্রকল্প' বোতামে ক্লিক করুন:

f708315ae07353d0.png

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

870a3cbd6541ee86.png

পরবর্তী প্রকল্প তৈরির ডায়ালগ আপনাকে আপনার নতুন প্রকল্পের বিশদ বিবরণ প্রবেশ করতে দেয়:

6a92c57d3250a4b3.png

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত Google ক্লাউড প্রকল্প জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে নেওয়া হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এটি পরে এই কোডল্যাবে PROJECT_ID হিসাবে উল্লেখ করা হবে।

পরবর্তী, যদি আপনি ইতিমধ্যে এটি না করে থাকেন, তাহলে Google ক্লাউড সংস্থানগুলি ব্যবহার করতে এবং ক্লাউড স্প্যানার API সক্ষম করার জন্য আপনাকে বিকাশকারী কনসোলে বিলিং সক্ষম করতে হবে৷

15d0ef27a8fbab27.png

এই কোডল্যাবের মাধ্যমে চালানোর জন্য আপনার কয়েক ডলারের বেশি খরচ করা উচিত নয়, তবে আপনি যদি আরও সংস্থান ব্যবহার করার সিদ্ধান্ত নেন বা আপনি যদি সেগুলিকে চলমান রেখে দেন তবে এটি আরও বেশি হতে পারে (এই নথির শেষে "পরিষ্কার" বিভাগটি দেখুন)। Google ক্লাউড স্প্যানার মূল্য এখানে নথিভুক্ত করা হয়েছে।

Google ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা $300 বিনামূল্যের ট্রায়ালের জন্য যোগ্য, যা এই কোডল্যাবটিকে সম্পূর্ণ বিনামূল্যে করতে হবে৷

গুগল ক্লাউড শেল সেটআপ

যদিও Google ক্লাউড এবং স্প্যানার আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আমরা Google ক্লাউড শেল ব্যবহার করব, ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত বিকাশের সরঞ্জামগুলির সাথে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এর মানে হল যে এই কোডল্যাবের জন্য আপনার যা দরকার তা হল একটি ব্রাউজার (হ্যাঁ, এটি একটি Chromebook এ কাজ করে)।

  1. ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল ক্লাউড শেল সক্রিয় করুন ক্লিক করুন gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHKLJXOgOg39g ddS2A (পরিবেশের সাথে সংযোগ স্থাপন এবং সংযোগের জন্য এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে)।

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvDu64GoM8 Rw

স্ক্রীন শট 2017-06-14 10.13.43 PM.png এ

একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রকল্পটি ইতিমধ্যেই আপনার 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 খুঁজছেন? সেটআপ ধাপে আপনি কোন আইডি ব্যবহার করেছেন তা দেখুন বা ক্লাউড কনসোল ড্যাশবোর্ডে দেখুন:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvOBziBc35650

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা আপনার ভবিষ্যত কমান্ড চালানোর সময় কার্যকর হতে পারে।

echo $GOOGLE_CLOUD_PROJECT

কমান্ড আউটপুট

<PROJECT_ID>
  1. অবশেষে, ডিফল্ট জোন এবং প্রকল্প কনফিগারেশন সেট করুন।
gcloud config set compute/zone us-central1-f

আপনি বিভিন্ন জোন বিভিন্ন চয়ন করতে পারেন. আরও তথ্যের জন্য, অঞ্চল এবং অঞ্চল দেখুন।

সারাংশ

এই ধাপে, আপনি আপনার পরিবেশ সেট আপ করুন।

পরবর্তী আপ

এরপরে, আপনি একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করবেন।

3. একটি ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করুন৷

এই ধাপে আমরা এই কোডল্যাবের জন্য আমাদের ক্লাউড স্প্যানার ইনস্ট্যান্স সেটআপ করি। স্প্যানার এন্ট্রি জন্য অনুসন্ধান করুন 1a6580bd3d3e6783.png বাম উপরের হ্যামবার্গার মেনুতে 3129589f7bc9e5ce.png অথবা "/" টিপে স্প্যানার অনুসন্ধান করুন এবং "স্প্যানার" টাইপ করুন

36e52f8df8e13b99.png

পরবর্তী, ক্লিক করুন 95269e75bc8c3e4d.png এবং আপনার উদাহরণের জন্য ক্লাউডস্প্যানার-লিডারবোর্ডের ইনস্ট্যান্স নামটি প্রবেশ করে ফর্মটি পূরণ করুন, একটি কনফিগারেশন নির্বাচন করুন (একটি আঞ্চলিক উদাহরণ নির্বাচন করুন) এবং নোডের সংখ্যা সেট করুন, এই কোডল্যাবের জন্য আমাদের শুধুমাত্র 1 নোডের প্রয়োজন হবে। উৎপাদন দৃষ্টান্তের জন্য এবং ক্লাউড স্প্যানার এসএলএ-এর জন্য যোগ্যতা অর্জন করতে আপনাকে আপনার ক্লাউড স্প্যানার দৃষ্টান্তে 3 বা তার বেশি নোড চালাতে হবে।

সবশেষে, কিন্তু অন্তত নয়, "তৈরি করুন" এ ক্লিক করুন এবং কয়েক সেকেন্ডের মধ্যে আপনার হাতে একটি ক্লাউড স্প্যানার ইনস্ট্যান্স আছে।

dceb68e9ed3801e8.png

পরবর্তী ধাপে আমরা আমাদের নতুন উদাহরণে একটি ডাটাবেস এবং স্কিমা তৈরি করতে C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে যাচ্ছি।

4. একটি ডাটাবেস এবং স্কিমা তৈরি করুন

এই ধাপে আমরা আমাদের নমুনা ডাটাবেস এবং স্কিমা তৈরি করতে যাচ্ছি।

আসুন দুটি টেবিল তৈরি করতে C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করি; প্লেয়ারের তথ্যের জন্য একটি প্লেয়ার টেবিল এবং প্লেয়ারের স্কোর সংরক্ষণের জন্য একটি স্কোর টেবিল। এটি করার জন্য আমরা ক্লাউড শেল-এ একটি C# কনসোল অ্যাপ্লিকেশন তৈরি করার ধাপগুলি অনুসরণ করব।

প্রথমে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি টাইপ করে Github থেকে এই কোডল্যাবের নমুনা কোডটি ক্লোন করুন:

git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git

তারপরে "অ্যাপ্লিকেশন" ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করুন যেখানে আপনি আপনার অ্যাপ্লিকেশন তৈরি করবেন।

cd dotnet-docs-samples/applications/

এই কোডল্যাবের জন্য প্রয়োজনীয় সমস্ত কোড বিদ্যমান dotnet-docs-samples/applications/leaderboard ডিরেক্টরিতে Leaderboard নামে একটি চলমান C# অ্যাপ্লিকেশন হিসাবে রয়েছে যা আপনি কোডল্যাবের মাধ্যমে অগ্রসর হওয়ার সাথে সাথে রেফারেন্স হিসাবে পরিবেশন করেন। আমরা একটি নতুন ডিরেক্টরি তৈরি করব এবং পর্যায়ক্রমে লিডারবোর্ড অ্যাপ্লিকেশনটির একটি অনুলিপি তৈরি করব।

অ্যাপ্লিকেশনটির জন্য "কোডেল্যাব" নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং নিম্নলিখিত কমান্ডের সাথে এটিতে ডিরেক্টরি পরিবর্তন করুন:

mkdir codelab && cd $_

নিম্নলিখিত কমান্ডটি ব্যবহার করে "লিডারবোর্ড" নামে একটি নতুন .NET C# কনসোল অ্যাপ্লিকেশন তৈরি করুন:

dotnet new console -n Leaderboard

এই কমান্ডটি দুটি ফাইল প্রাথমিক ফাইল সমন্বিত একটি সাধারণ কনসোল অ্যাপ্লিকেশন তৈরি করে, প্রজেক্ট ফাইল Leaderboard.csproj এবং প্রোগ্রাম ফাইল Program.cs

চলুন এটা চালানো যাক. নতুন তৈরি লিডারবোর্ড ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করুন যেখানে অ্যাপ্লিকেশনটি থাকে:

cd Leaderboard

তারপর এটি চালানোর জন্য নিম্নলিখিত কমান্ড লিখুন।

dotnet run

আপনি "হ্যালো ওয়ার্ল্ড!" অ্যাপ্লিকেশন আউটপুট দেখতে হবে.

এখন আসুন দুটি টেবিল প্লেয়ার এবং স্কোর সমন্বিত একটি লিডারবোর্ড তৈরি করতে C# স্প্যানার ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে Program.cs সম্পাদনা করে আমাদের কনসোল অ্যাপ আপডেট করি। আপনি ক্লাউড শেল এডিটরে এটি করতে পারেন:

নীচে হাইলাইট করা আইকনে ক্লিক করে ক্লাউড শেল সম্পাদক খুলুন:

73cf70e05f653ca.png

এরপরে, ক্লাউড শেল এডিটরে Program.cs ফাইলটি খুলুন এবং Program.cs ফাইলে নিম্নলিখিত C# অ্যাপ্লিকেশন কোড পেস্ট করে leaderboard ডাটাবেস এবং Players এবং Scores টেবিল তৈরির জন্য প্রয়োজনীয় কোড দিয়ে ফাইলের বিদ্যমান কোডটি প্রতিস্থাপন করুন:

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);
        }
    }
}

প্রোগ্রাম কোডের একটি পরিষ্কার ছবি প্রদান করার জন্য, এখানে প্রোগ্রামটির একটি ডায়াগ্রাম রয়েছে যার প্রধান উপাদানগুলি লেবেলযুক্ত:

b70b1b988ea3ac8a.png

আপনি 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# Spanner Nuget প্যাকেজ Google.Cloud.Spanner.Data এ একটি রেফারেন্স যোগ করেছে যা আমাদের ক্লাউড স্প্যানার API-এর সাথে যোগাযোগ করতে হবে। এই পরিবর্তনটি CommandLineUtil প্রকল্পে একটি রেফারেন্স যোগ করে যা dotnet-doc-samples Github সংগ্রহস্থলের অংশ এবং ওপেন সোর্স 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

ক্লাউড কনসোলের ক্লাউড স্প্যানার বিভাগে আপনি বাম দিকের মেনুতে আপনার নতুন ডাটাবেস এবং টেবিলগুলি দেখতে পাবেন।

ba9008bb84cb90b0.png

পরবর্তী ধাপে আমরা আপনার নতুন ডাটাবেসে কিছু ডেটা লোড করার জন্য আমাদের অ্যাপ্লিকেশন আপডেট করব।

5. ডেটা লোড করুন

আমাদের এখন leaderboard নামক একটি ডাটাবেস আছে যেখানে দুটি টেবিল রয়েছে; Players এবং Scores । এখন আসুন C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করি প্লেয়ারের সাথে আমাদের Players টেবিল এবং প্রতিটি প্লেয়ারের জন্য এলোমেলো স্কোর সহ আমাদের Scores টেবিল।

নীচে হাইলাইট করা আইকনে ক্লিক করে ক্লাউড শেল সম্পাদক খুলুন:

4d17840699d8e7ce.png

এর পরে, ক্লাউড শেল এডিটরে Program.cs ফাইলটি সম্পাদনা করুন একটি insert কমান্ড যোগ করতে যা Players টেবিলে 100 জন খেলোয়াড় সন্নিবেশ করতে ব্যবহার করা যেতে পারে বা এটি Players প্রতিটি খেলোয়াড়ের জন্য Scores টেবিলে 4টি র্যান্ডম স্কোর সন্নিবেশ করতে ব্যবহার করা যেতে পারে। টেবিল

প্রথমে বিদ্যমান create কমান্ড ব্লকের নীচে প্রোগ্রামের শীর্ষে "Verbmap" এ একটি নতুন 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 কমান্ডটি কার্যকরী করতে, আপনার প্রোগ্রামের "প্রধান" পদ্ধতিতে নিম্নলিখিত কোডটি যুক্ত করুন:

                .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 প্রত্যাশিত যা সঞ্চালনের জন্য "সন্নিবেশের প্রকার"। এই যুক্তিতে 'খেলোয়াড়' বা 'স্কোর' এর মান থাকতে পারে।

এখন আমরা create কমান্ড কল করার সময় insert কমান্ডটি একই আর্গুমেন্ট মান দিয়ে রান করি, অতিরিক্ত "টাইপ অফ ইনসার্ট" আর্গুমেন্ট হিসেবে "প্লেয়ার্স" যোগ করে। আপনি এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডি দিয়ে 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

এখন Players টেবিলের প্রতিটি খেলোয়াড়ের জন্য টাইমস্ট্যাম্প সহ চারটি র্যান্ডম স্কোর সহ আমাদের Scores টেবিলটি পূরণ করতে C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করা যাক।

Scores টেবিলের Timestamp কলামকে নিম্নোক্ত SQL স্টেটমেন্টের মাধ্যমে একটি "কমিট টাইমস্ট্যাম্প" কলাম হিসাবে সংজ্ঞায়িত করা হয়েছিল যা আমরা পূর্বে create কমান্ডটি চালানোর সময় কার্যকর করা হয়েছিল:

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 অপারেশনগুলির জন্য সঠিক লেনদেন টাইমস্ট্যাম্প সহ স্বয়ংক্রিয়ভাবে জনবহুল হতে সক্ষম করে৷

আপনি একটি "কমিট টাইমস্ট্যাম্প" কলামে আপনার নিজস্ব টাইমস্ট্যাম্প মান সন্নিবেশ করতে পারেন যতক্ষণ না আপনি অতীতের একটি মান সহ একটি টাইমস্ট্যাম্প সন্নিবেশ করান, যা আমরা এই কোডল্যাবের উদ্দেশ্যে করব৷

এখন আমরা একই আর্গুমেন্ট মান দিয়ে insert কমান্ডটি রান করি যখন আমরা create কমান্ডকে "স্কোর" যোগ করে অতিরিক্ত "টাইপ অফ ইনসার্ট" আর্গুমেন্ট হিসাবে ব্যবহার করি। আপনি এই কোডল্যাবের শুরুতে তৈরি করা প্রজেক্ট আইডি দিয়ে 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");

Timestamp কলামে টাইমস্ট্যাম্পের সাথে স্বয়ংক্রিয়ভাবে "সন্নিবেশ" লেনদেন যখন সংঘটিত হয়, আপনি পরিবর্তে C# ধ্রুবক SpannerParameter.CommitTimestamp সন্নিবেশ করতে পারেন নিচের কোড স্নিপেটের মতো:

cmd.Parameters["Timestamp"].Value = SpannerParameter.CommitTimestamp;

এখন যেহেতু আমরা ডেটা লোডিং সম্পন্ন করেছি, আসুন আমরা এইমাত্র আমাদের নতুন টেবিলে যে মানগুলি লিখেছি তা যাচাই করি। প্রথমে leaderboard ডাটাবেস নির্বাচন করুন এবং তারপর Players টেবিল নির্বাচন করুন। Data ট্যাবে ক্লিক করুন। আপনি দেখতে পাবেন যে আপনার টেবিলের PlayerId এবং PlayerName কলামে ডেটা আছে।

7bc2c96293c31c49.png

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

d8a4ee4f13244c19.png

ভালো হয়েছে! আসুন কিছু প্রশ্ন চালানোর জন্য আমাদের প্রোগ্রাম আপডেট করি যা আমরা একটি গেমিং লিডারবোর্ড তৈরি করতে ব্যবহার করতে পারি।

6. লিডারবোর্ড কোয়েরি চালান

এখন যেহেতু আমরা আমাদের ডাটাবেস সেট আপ করেছি এবং আমাদের টেবিলে তথ্য লোড করেছি, আসুন এই ডেটা ব্যবহার করে একটি লিডারবোর্ড তৈরি করি। এটি করার জন্য আমাদের নিম্নলিখিত চারটি প্রশ্নের উত্তর দিতে হবে:

  1. কোন খেলোয়াড় সর্বকালের "শীর্ষ দশ"?
  2. কোন খেলোয়াড় বছরের "শীর্ষ দশ"?
  3. কোন খেলোয়াড় মাসের "শীর্ষ দশ"?
  4. কোন খেলোয়াড় সপ্তাহের "শীর্ষ দশ"?

এসকিউএল কোয়েরি চালানোর জন্য আমাদের প্রোগ্রাম আপডেট করা যাক যা এই প্রশ্নের উত্তর দেবে।

আমরা একটি query কমান্ড যোগ করব যা আমাদের লিডারবোর্ডের জন্য প্রয়োজনীয় তথ্য তৈরি করবে এমন প্রশ্নের উত্তর দেওয়ার জন্য প্রশ্নগুলি চালানোর একটি উপায় প্রদান করবে।

একটি query কমান্ড যোগ করতে প্রোগ্রাম আপডেট করতে ক্লাউড শেল এডিটরে Program.cs ফাইলটি সম্পাদনা করুন।

প্রথমে বিদ্যমান insert কমান্ড ব্লকের নীচে প্রোগ্রামের শীর্ষে "Verbmap" এ একটি নতুন 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 কমান্ডটি কার্যকরী করতে, আপনার প্রোগ্রামের "প্রধান" পদ্ধতিতে নিম্নলিখিত কোডটি যুক্ত করুন:

                .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.

আপনি প্রতিক্রিয়া থেকে দেখতে পাচ্ছেন যে প্রজেক্ট আইডি, ইনস্ট্যান্স আইডি এবং ডেটাবেস আইডি ছাড়াও আরও একটি আর্গুমেন্ট value pos. 3 প্রত্যাশিত যা আমাদের Scores টেবিলের Timestamp কলামে তাদের মানের উপর ভিত্তি করে রেকর্ড ফিল্টার করার জন্য ব্যবহার করার জন্য ঘন্টার সংখ্যার একটি সময়কাল নির্দিষ্ট করতে দেয়। এই যুক্তিটির একটি ডিফল্ট মান 0 রয়েছে যার অর্থ টাইমস্ট্যাম্প দ্বারা কোনও রেকর্ড ফিল্টার করা হবে না। তাই আমরা আমাদের সর্বকালের "শীর্ষ দশ" খেলোয়াড়ের তালিকা পেতে "টাইমস্প্যান" মান ছাড়াই query কমান্ড ব্যবহার করতে পারি।

আসুন "টাইমস্প্যান" উল্লেখ না করে 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

এখন 8760 ঘন্টার সমান একটি "টাইমস্প্যান" নির্দিষ্ট করে বছরের "শীর্ষ দশ" খেলোয়াড়কে জিজ্ঞাসা করার জন্য প্রয়োজনীয় আর্গুমেন্ট সহ query কমান্ডটি চালানো যাক । নিশ্চিত করুন যে আপনি প্রজেক্ট আইডি দিয়ে 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 কমান্ডটি চালানো যাক একটি মাসে ঘন্টার সংখ্যার সমান একটি "টাইমস্প্যান" উল্লেখ করে যা 730। নিশ্চিত করুন যে আপনি 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

এখন সপ্তাহের "শীর্ষ দশ" প্লেয়ারকে জিজ্ঞাসা করার জন্য একটি "টাইমস্প্যান" নির্দিষ্ট করে একটি সপ্তাহে ঘন্টার সংখ্যা যা 168, তা নির্দিষ্ট করে query কমান্ডটি চালান । নিশ্চিত করুন যে আপনি 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

চমৎকার কাজ!

এখন আপনি রেকর্ড যোগ করার সাথে সাথে স্প্যানার আপনার ডাটাবেসকে যত বড় করতে হবে ততই স্কেল করবে।

আপনার ডাটাবেস যতই বাড়ুক না কেন, আপনার গেমের লিডারবোর্ড স্প্যানার এবং এর ট্রুটাইম প্রযুক্তির সাথে নির্ভুলতার সাথে স্কেল করা চালিয়ে যেতে পারে।

7. পরিষ্কার করা

স্প্যানারের সাথে মজা করার পরে আমাদের খেলার মাঠ পরিষ্কার করতে হবে, মূল্যবান সম্পদ এবং অর্থ বাঁচাতে হবে। ভাগ্যক্রমে এটি একটি সহজ পদক্ষেপ, শুধুমাত্র বিকাশকারী কনসোলে যান এবং "ক্লাউড স্প্যানার ইন্সট্যান্স সেটআপ করুন" নামের কোডল্যাব ধাপে আমরা যে উদাহরণটি তৈরি করেছি সেটি মুছুন।

8. অভিনন্দন!

আমরা যা কভার করেছি:

  • লিডারবোর্ডের জন্য Google ক্লাউড স্প্যানার ইনস্ট্যান্স, ডেটাবেস এবং টেবিল স্কিমা
  • কিভাবে .NET Core C# কনসোল অ্যাপ্লিকেশন তৈরি করবেন
  • C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে একটি স্প্যানার ডেটাবেস এবং টেবিল তৈরি করবেন
  • কিভাবে C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে একটি স্প্যানার ডাটাবেসে ডেটা লোড করবেন
  • স্প্যানার কমিট টাইমস্ট্যাম্প এবং C# ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে আপনার ডেটা থেকে "শীর্ষ দশ" ফলাফল অনুসন্ধান করবেন

পরবর্তী পদক্ষেপ:

আমাদের আপনার মতামত দিন

  • আমাদের খুব সংক্ষিপ্ত সমীক্ষা সম্পূর্ণ করার জন্য একটু সময় নিন